2015-08-20 5 views
9

Mit Laravel 5.1 versuche ich eine Menüliste aus einer MySQL-Kategorietabelle zu erstellen. Mein Dienstanbieter gibt Daten zurück, aber ich verstehe nicht, wie die untergeordneten Kategorien in einer foreach-Schleife erstellt werden. Wenn ich die Schleife ausführe, wird nur die letzte Zeile der untergeordneten Abfrage zurückgegeben. Jede Anleitung würde geschätzt werden.Laravel gibt Kinder von Eltern in derselben Tabelle zurück

Kategorien Tabelle

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 

Gewünschtes Ergebnis

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

Kopfsicht

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

Antwort

15

Vor allem, was Sie tun, ist ineffizient. Ihre Ansicht durchläuft alle Unterkategorien für jede übergeordnete Kategorie. Wenn Sie Relationen richtig definiert und Egoquents eifriges Laden verwendet haben, können Sie auf einfachere Weise untergeordnete Kategorien abrufen und aufrufen.

Beginnen Sie mit der Definition Beziehungen:

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

Sobald Sie die Beziehungen definiert richtig haben, können Sie wie unten ganzen Kategoriebaum holen:

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

Der zweite Komponist wird nicht benötigt, da Elternkategorien enthalten bereits Kinder.

Nun müssen Sie nur die Kategorien in der Ansicht angezeigt werden:

<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

Ich habe die Lösung selbst gefunden. Ich muss die Ergebnisse durchlaufen, um Zugriff auf die Elementvariable zu erhalten.

@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 
Verwandte Themen