У меня есть таблица категорий. У каждой категории может быть дополнительный родитель (по умолчанию 0, если родителя нет).
Что я хочу сделать, так это построить простое дерево списка html с уровнями категорий.
Примерная дата:
Foods
-- Fruit
---- Apple
---- Banana
---- Orange
-- Veg
---- Cucumber
---- Lettuce
Drinks
-- Alcoholic
---- Beer
---- Vodka
Misc
-- Household Objects
---- Kitchen
------ Electrical
-------- Cooking
---------- Stove
---------- Toaster
---------- Microwave
Обратите внимание, что это должно работать примерно на 10 «уровнях». Я бы хотел, чтобы он был бесконечным, но я действительно не хочу идти по пути использования модели вложенного набора, поскольку это вызовет огромные задержки в этом проекте.
Документы по этому для laravel ужасны, без реальной ссылки на то, с чего даже начать. Я играл с ним в течение нескольких дней, пытаясь понять, что делать, и, кажется, ничего не получается без огромного грязного блока для каждого цикла внутри друг друга 10 раз.
У меня есть дерево данных, использующее в моей модели следующее:
<?php
class Item extends Eloquent {
public function parent()
{
return $this->hasOne('Item', 'id', 'parent_id');
}
public function children()
{
return $this->hasMany('Item', 'parent_id', 'id');
}
public function tree()
{
return static::with(implode('.', array_fill(0,10, 'children')))->where('parent_id', '=', '0')->get();
}
}
Это поднимает всех родительских и дочерних элементов до уровня 10. Это прекрасно работает, но вы не можете ничего сделать с дочерними данными, не имея вручную 10 циклов foreach друг в друге.
Что я здесь делаю неправильно? Конечно, это не должно быть так сложно/плохо выполнено? Все, что я хочу сделать, это получить простой список html с элементами в древовидной структуре.
Я собрал быстрый пример SQLFiddle с фиктивными данными, использованными выше: http://sqlfiddle.com/#!2/e6d18/1