Models/Catalog.php
public static function getCategories() {
// Получаем одним запросом все разделы
$arr = self::orderBy('name')->get();
// Запускаем рекурсивную постройку дерева и отдаем на выдачу
return self::buildTree($arr, 0);
}
// Сама функция рекурсии
public static function buildTree($arr, $pid = 0) {
// Находим всех детей раздела
$found = $arr->filter(function($item) use ($pid){return $item->parent_id == $pid; });
// Каждому детю запускаем поиск его детей
foreach ($found as $key => $cat) {
$sub = self::buildTree($arr, $cat->id);
$cat->sub = $sub;
}
return $found;
}
Все подкатегории улетают в свойство
sub категории.
Запрашиваем в контроллере категории:
public function index() {
$categories = Catalog::getCategories();
return view('Catalog.index')
->withCategories($categories);
}
И в виде выводим категории рекурсивно.
catalog.partial.show:
<ul>
@foreach($categories as $category)
<li>
{{$category->name}}
@if($category->sub->count())
@include('catalog.partial.show', ['categories' => $category->sub])
@endif
</li>
@endforeach
</ul>