Задать вопрос
  • Дерево категорий Laravel. Как уменьшить количество запросов в БД?

    @senslab
    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>
    Ответ написан
    Комментировать