Дерево категорий Laravel. Как уменьшить количество запросов в БД?
Если используете PostgreSQL, посмотрите в сторону рекурсивных подзапросов.
Если это не PostgreSQL, то можете попробовать строить дерево из "сырых данных" непосредственно в PHP (как подсказывает Вам ThunderCat ).
Но вообще лично я бы для начала оценил частоту изменений категорий в каталоге и общее количество категорий (объем данных), и в соответствии с этой информацией выбрал более подходящую модель хранения деревьев в БД.
Таких основных моделей четыре: Adjacency list, Nested Sets, Materialized Path и Closure Tables (можно рассматривать как развитие Adjacency List) плюс их вариации.
Каждый тип модели может послужить для оптимизации выборки данных из древовидных структур в БД.
Присутствуют готовые библиотеки и для Laravel:Nested SetClosure Tables
Для Adjacency List (вашей текущей реализации), просто сортируйте данные самостоятельно, либо попробуйте этот пакет.
Добавьте в with подгрузку ещё пары уровней with('ProductCategory', 'ProductCategory.ProductCategory', 'ProductCategory.ProductCategory.ProductCategory'), а то у вас начиная со второго уровня идёт ленивая подгрузка с большим количеством запросов. Будет пара лишних запросов, но но это не критично для большинства проектов.
Если вы грузите всё дерево целиком, то можете выбирать его так же целиком, а потом уже на стороне php собирать это дерево.