Дерево категорій Laravel
Код шаблону 'layouts.catalog'
І код шаблону 'layouts.partials.treeChildMenu'
Все як би добре

Але лякає кількість запитів до бази даних. Може, це можна якось оптимізувати? Тому що при додаванні нових пунктів меню запитів стає все більше і багато.
Якщо ви використовуєте 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. Хлібні крихти малювати щоб, наприклад
Вакуумний приклад з таблицею. Блейдом не користувався, але думаю можна йому масив якийсь дати або як там робиться
По-хорошому краще взагалі зберігати хтмл кеш готового дерева та замінювати його після кожної операції над ним