2015-08-20 13 views
9

Utilizzando Laravel 5.1, sto cercando di creare un elenco di menu da una tabella di categorie MySQL. Il mio fornitore di servizi restituisce i dati, ma non capisco come creare le categorie figlio in un ciclo foreach. Quando eseguo il ciclo, viene restituita solo l'ultima riga della query figlio. Qualsiasi guida sarebbe apprezzata.Laravel restituisce figli di genitori nello stesso tavolo

categorie Tabella

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 

Risultato desiderato

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

intestazione vista

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

risposta

15

Prima di tutto, ciò che si sta facendo è inefficiente. La tua vista scorre tutte le sottocategorie per ogni categoria genitore. Se hai definito le relazioni correttamente e hai fatto uso del carico entusiasta di Eloquent, puoi recuperare e accedere alle categorie figlio in modo più semplice.

Inizia con le relazioni che definiscono:

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

Una volta che si hanno le relazioni definite correttamente, è possibile recuperare tutto l'albero categoria come di seguito:

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

non sarà necessario il secondo compositore, come le categorie principali contengono già bambini.

Ora, avete solo bisogno di visualizzare le categorie nella vista:

<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

ho trovato la soluzione io stesso. Devo scorrere i risultati per ottenere l'accesso alla variabile membro.

@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 
Problemi correlati