Дерево категорій Laravel

Код шаблону 'layouts.catalog'

І код шаблону 'layouts.partials.treeChildMenu'

Все як би добре

laravel

Але лякає кількість запитів до бази даних. Може, це можна якось оптимізувати? Тому що при додаванні нових пунктів меню запитів стає все більше і багато.

Якщо ви використовуєте PostgreSQL, подивіться у бік рекурсивних підзапитів.

Якщо це не PostgreSQL, то можете спробувати будувати дерево із "сирих даних" безпосередньо в PHP (як нагадує ThunderCat).

Таких основних моделей чотири: Adjacency list, Nested Sets, Materialized Path та Closure Tables (можна розглядати як розвиток Adjacency List) плюс їх варіації.

Кожен тип моделі може бути оптимізації вибірки даних з деревоподібних структур у БД.

Існують готові бібліотеки і для Laravel: Nested Set Closure Tables

Для Adjacency List (вашої поточної реалізації) просто сортуйте дані самостійно, або спробуйте цей пакет.

Я б порадив вам замість звичайного дерева, використовувати Nested Set дерево (вкладені множини). На чистому PHP як це робиться добре написано www.getinfo.ru/article610.html. Для Laravel є добрий пакет https://github.com/etrepat/baum (сам ним користуюсь).

Приклад моєї таблиці

Плюси такого підходу - усю гілку можна одержати одні запитом. Мінус більш складна вставка та оновлення.

Я у себе з деяких пір каталоги та сторінки зберігаю саме в такому дереві – отримати хлібні крихти на сторінці – 1 запит. Отримати дерево каталогів - 1 запит.

Спочатку краще зрозуміти концепцію www.getinfo.ru/article610.html

А потім приклад, у документації з пакету в принципі на всі випадки є приклади.

2. Створити модельphp artisan baum:install "назва вашої моделі" з'явиться модель і міграція виконайте міграцію. І подивіться, чим відрізняються таблиці. Декілька нових полів (лівий і правий індекси та рівень)

3. Використовувати необхідні функції роботи з моделлю.

Додайте в with підвантаження ще пари рівнів with('ProductCategory', 'ProductCategory.ProductCategory', 'ProductCategory.ProductCategory.ProductCategory'), а то у вас починаючи з другого рівня йде лінива підвантаження з великою кількістю запитів. Буде кілька зайвих запитів, але це не критично для більшості проектів.

Якщо ви вантажите все дерево повністю, то можете вибирати його так само, а потім вже на стороні php збирати це дерево.

Докладу свій варіант (якраз для елоквенту), два класи, складіть кудись і перейменуйте як вам треба.

На виході можна отримати модель за її ід ($tree->getNode($id)) і масив вкладених моделей моделі з таким-то ід ($tree->getSubnodes($id)). Можна ще гілку отримати - $tree->getBranch($id) видасть масив моделей від кореневої до тієї, у якої ід = $id. Хлібні крихти малювати щоб, наприклад

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

По-хорошому краще взагалі зберігати хтмл кеш готового дерева та замінювати його після кожної операції над ним