Laravel возвращает детей родителей в один стол

Используя Laravel 5.1, я пытаюсь создать список меню из таблицы категорий MySQL. Мой поставщик услуг возвращает данные, но я не понимаю, как создавать дочерние категории в цикле foreach. Когда я выполняю цикл, возвращается только последняя строка дочернего запроса. Любые рекомендации будут оценены.

категории Таблица

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 

Желаемый результат

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

просмотр заголовка

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

Прежде всего, то, что вы делаете, неэффективно. Ваше представление выполняет итерацию по всем подкатегориям для каждой родительской категории. Если вы правильно определили отношения и использовали интенсивную загрузку Eloquent, вы могли бы легче получить и получить доступ к дочерним категориям.

Начните с определения отношений:

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

Когда вы правильно определили отношения, вы можете получить общее дерево категорий, как показано ниже:

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

Второй композитор не понадобится, поскольку родительские категории уже содержат детей.

Теперь вам нужно отображать только категории в вашем представлении:

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

Я нашел решение самостоятельно. Я должен повторить результаты, чтобы получить доступ к переменной-члену.

 @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 как @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