2015-08-20 14 views
9

Laravel 5.1'i kullanarak, bir MySQL kategorisi tablosundan bir menü listesi oluşturmaya çalışıyorum. Servis sağlayıcım veri döndürüyor, ancak foreach döngüsünde alt kategorileri nasıl oluşturacağımı anlamıyorum. Döngüyü gerçekleştirdiğimde, yalnızca alt sorgunun son satırı döndürülür. Herhangi bir rehberlik takdir edilecektir.Laravel ebeveynlerin çocuklarını aynı masada döndürüyor

kategori Tablo

id | cat_name  | cat_parent_id 
--- | --------------| ------------- 
1 | Parent Cat 1 | NULL 
2 | Parent Cat 2 | NULL 
3 | Child Cat 1 | 2 
4 | Child Cat 2 | 2 
5 | Parent Cat 3 | NULL 
6 | Child Cat 3 | 5 

istenen sonuç

Parent Cat 1 
Parent Cat 2 
    Child Cat 1 
    Child Cat 2 
Parent Cat 3 
    Child Cat 3 

viewComposerServiceProvider.php

public function boot() 
{ 
     $this->composeTopCategoryNavigation(); 
     $this->composeSubCategoryNavigation(); 
} 

private function composeTopCategoryNavigation() 
{ 
    view()->composer('partials.header', function($view) 
     { 
      $view->with('top_cats', Category::whereNull('cat_parent_id')->orderBy('cat_name', 'asc')->get()); 
     }); 
} 

private function composeSubCategoryNavigation() 
{ 
     view()->composer('partials.header', function($view) 
     { 
      $view->with('sub_cats', Category::whereNotNull('cat_parent_id')->orderBy('cat_name', 'asc')->get()); 
     }); 
} 

başlık görünümü ne yaptığını tüm

<ul> 
@foreach ($top_cats as $top_cat) 
    <?php $top_cat_slug = str_slug($top_cat->cat_name, "-"); ?> 
    <li>{{ $top_cat->cat_name }} 
    @foreach ($sub_cats as $sub_cat) 
      @if ($sub_cat->cat_parent_id === $top_cat->id) 
       <ul> 
        <li{{ $sub_cat->cat_name }}</li> 
       </ul> 
       @endif 
     @endforeach 
    </li> 
@endforeach 
</ul> 

cevap

15

Birincisi, verimsizdir. Görüşünüz, her ana kategori için tüm alt kategorilerde yinelenir. İlişkileri doğru tanımladıysanız ve Eloquent'in hevesli yüklemesini kullandıysanız, çocuk kategorilerini daha kolay bir şekilde getirip erişebilirsiniz. tanımlayan ilişkileriyle

Başlangıç: düzgün tanımlanmış ilişkilere sahip kez

class Category extends Model { 
    //each category might have one parent 
    public function parent() { 
    return $this->belongsToOne(static::class, 'cat_parent_id'); 
    } 

    //each category might have multiple children 
    public function children() { 
    return $this->hasMany(static::class, 'cat_parent_id')->orderBy('cat_name', 'asc'); 
    } 
} 

, aşağıda gibi bütün kategori ağacı getirebilir:

view()->composer('partials.header', function($view) { 
    $view->with('categories', Category::with('children')->whereNull('cat_parent_id')->orderBy('cat_name', 'asc')->get()); 
}); 

ikinci besteci ihtiyaç olmayacak şekilde Ebeveyn kategorileri zaten çocukları içerir.

Şimdi, yalnızca görünümde kategorileri görüntülemek gerekir:

<ul> 
    @foreach ($categories as $parent) 
    <li>{{ $parent->cat_name }} 
     @if ($parent->children->count()) 
     <ul> 
      @foreach ($parent->children as $child) 
      <li>{{ $child->cat_name }}</li> 
      @endforeach 
     </ul> 
     @endif 
    </li> 
    @endforeach 
</ul> 
0

Ben çözüm kendim buldum. Üye değişkenine erişmek için sonuçlarda yinelemeliyim.

İlgili konular