Norgul Norgul - 2 months ago 23
PHP Question

Laravel order by related table

I have Product and Category models in my project. Product belongs to Category. Since Product has foreign key category_id, I could easily sort the output like so:

$products = Product::orderBy('category_id', 'asc')->get();

But what I really wanted is to sort Products by Category name, so I tried:

$products = Product::with(['categories' => function($q){
$q->orderBy('name', 'asc')->first();

But that outputs nothing. As a test, I have returned
return Product::with('categories')->first();
and it outputs fine...

Here are the Eloquent relations.


class Product extends Model
protected $fillable = [

protected $hidden = [

public function categories()
return $this->belongsTo('\App\Category', 'category_id');


class Category extends Model
protected $fillable = [

public function products()
return $this->hasMany('\App\Product');

And the view part:

@foreach ($products as $product)

<td>{!! $product->categories->name !!}</td>
<td>{!! $product->name !!}</td>
<td>{!! $product->description !!}</td>
<td>{!! $product->price !!}</td>
<a href="{{ url('/product/'.$product->id.'/edit') }}">
<i class="fa fa-fw fa-pencil text-warning"></i>
<a href="" data-href="{{route('product.destroyMe', $product->id)}}"
data-toggle="modal" data-target="#confirm-delete">
<i class="fa fa-fw fa-times text-danger"></i>


I have not tested this, but I think this should work

// Get all the products
$products = \App\Product::all();

// Add Closure function to the sortBy method, to sort by the name of the category
$products->sortBy(function($product) { 
  return $product->categories()->name;

This should also working:

 $products = Product::with('categories')->get()
   ->sortBy(function($product) { 
       return $product->categories->name;