2015-08-20 11 views
9

Przy użyciu Laravel 5.1, próbuję utworzyć listę menu z tabeli kategorii MySQL. Mój usługodawca zwraca dane, ale nie rozumiem, jak utworzyć kategorie podrzędne w pętli foreach. Kiedy wykonuję pętlę, zwracany jest tylko ostatni wiersz zapytania podrzędnego. Wszelkie wskazówki będą mile widziane.Laravel powraca dzieci rodziców w tym samym tabeli

kategorie Tabela

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 

pożądanego wyniku

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()); 
     }); 
} 

nagłówek widok

<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> 

Odpowiedz

15

Przede wszystkim, co robisz, jest nieefektywne. Twój widok iteruje przez wszystkie podkategorie dla każdej kategorii nadrzędnej. Jeśli poprawnie zdefiniowałeś relacje i wykorzystałeś intensywne ładowanie Eloquent, możesz pobrać i uzyskać dostęp do kategorii podrzędnych w łatwiejszy sposób.

Zacznij relacji określających:

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'); 
    } 
} 

Gdy masz relacje zdefiniowane prawidłowo, można pobrać całe drzewo kategorii jak poniżej:

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

Drugi kompozytor nie będą potrzebne, jak kategorie nadrzędne zawierają już dzieci.

Teraz trzeba tylko do wyświetlania w widoku kategorii:

<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

Znalazłem rozwiązanie siebie. Muszę powtórzyć wyniki, aby uzyskać dostęp do zmiennej składowej.

@foreach($locations as $location) 
      <tr> 
       <td> 
        {{$location->location_id}} 
       </td> 
       <td> 
        @foreach($location->members as $member) 
         {{$member->first_name}} 
        @endforeach 
       </td> 
       <td> 

       </td> 
      </tr> 
     @endforeach 
Powiązane problemy