2016-04-26 79 views
5

Projemde Ürün ve Kategori modelleri var. Ürün kategorisine aittir. Ama ne gerçekten istediğim Kategori adıyla Ürünleri sıralamak etmektirLaravel ilgili tabloya göre düzenle

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

, bu yüzden denedim: Ürün yabancı anahtar category_id sahip olduğundan, kolayca şöyle çıkışını sıralamak

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

Ama bu çıkışlar hiçbir şey değil. Bir test olarak, return Product::with('categories')->first();'u iade ettim ve çıktılar iyi çıktı ...

İşte Eloquent ilişkiler.

Ürün

class Product extends Model 
{ 
    protected $fillable = [ 
     'name', 
     'description', 
     'price', 
     'category_id', 
    ]; 

    protected $hidden = [ 
     'created_at', 
     'updated_at', 
    ]; 

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

Kategori:

class Category extends Model 
{ 
    protected $fillable = [ 
     'name' 
    ]; 

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

Ve görünümü kısmı:

@foreach ($products as $product) 
       <tr> 

        <td>{!! $product->categories->name !!}</td> 
        <td> 
         @if(!empty($product->picture)) 
          Yes 
         @else 
          No 
         @endif 
        </td> 
        <td>{!! $product->name !!}</td> 
        <td>{!! $product->description !!}</td> 
        <td>{!! $product->price !!}</td> 
        <td> 
         <a href="{{ url('/product/'.$product->id.'/edit') }}"> 
          <i class="fa fa-fw fa-pencil text-warning"></i> 
         </a> 
         <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> 
         </a> 
        </td> 
       </tr> 
      @endforeach 

cevap

2

Bu test değil ama bu

çalışması gerektiğini düşünüyorum 012
// 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; 
}); 

Buda çalışma olmalıdır:

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

Bu işe yaramaz. Ve mantıklı bir anlamı yok. Ürün sadece bir kategoriye sahip olabilir. İlişkileri Tinker'de test ettim ve gerektiği gibi çalışıyorlar. Modeller sorun olmamalıdır – Norgul

+0

Ürünün yalnızca bir kategoriye sahip olması halinde, bunu çoğul kategoriler olarak adlandırmayın. Bu kafa karıştırıcı – geckob

+0

Neden işe yaramadığını görüyorum – geckob

3

Sen (katılmak kullanabilirsiniz),

$query = new Product; //new object 
//$query = Product::where('id','!=',0); 
$query = $query->join('categories', 'categories.id','=','products.categories.id'); 
$query = $query->select('categories.name as cat_name','products.*'); 
$query = $query->orderBy('cat_name','asc'); 
$record = $query->get(); 
+0

Niçin yeni ürün? Tüm mevcut ürünlere ihtiyacım var – Norgul

+0

Yeni ürün kullanarak 'Ürün' sınıfının yeni bir nesnesini yaratabilirsiniz. Eğer bazı ek maddeleri ekleyebilirseniz, ikinci satırı da değiştirebilirsiniz. – DsRaj

+0

Herhangi bir kategoriye ait olmayan ürünler varsa, 'join' yerine 'leftjoin' kullanın. –