На данный момент у вас есть несколько вариантов.
1) Пусть Eloquent сделает тяжелую работу
Для приложений с небольшим / малым трафиком я бы сказалэтот подход хорош, но не слишком эффективен, поскольку он будет загружать каждое отношение одно за другим, однако он должен дать вам желаемые результаты:
$data['places'] = Place::whereNull('parent_id')->with('children')->get();
Проверка на parent_id
, являющуюся null
, получит толькокорневые элементы.
2) Построить дерево
Другой вариант, который был бы немного более эффективным (с точки зрения БД), заключается в загрузке всех категорий.и создайте дерево в вашем контроллере:
$allPlaces = Place::all();
function getChildren($places, $place)
{
$children = $places->where('parent_id', $place->id)->all()
->map(function ($child) use ($places) {
return getChildren($places, $child);
});
$place->setRelation('children', $children);
return $place;
}
$data['places'] = $allPlaces
->filter(function ($place) {
return is_null($place->parent_id);
})
->map(function ($place) use ($allPlaces) {
return getChildren($allPlaces, $place);
});
3) Используйте вложенные наборы
На этом этапе может быть немного убито, но стоило бы иметьвзгляд на https://github.com/lazychaser/laravel-nestedset