【发布时间】:2018-03-23 23:08:12
【问题描述】:
我有一个类别表。每个类别都可以有一个可选的父级(如果没有父级,则默认为 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
【问题讨论】:
-
嵌套集实际上更简单。另外,已经有一些现有的包,比如Cartalyst's Nested Sets 或Baum。
-
Jason,与公认的答案相比,嵌套集的优势是什么?我必须在两者之间做出决定。对于 Baum,似乎无论如何都无法检索那棵树,除非您也使用公认的答案。
标签: php parent-child laravel laravel-4 eloquent