请考虑下表
我想要的结果:
A
---AA1
------AAA1
---------AAAA1
---------AAAA2
---AA2
B
---BB1
---BB2
------BBB1
C
---CC1
------CCC1
---CC2
我的问题:
我需要在此父级的刀片文件上显示第n个子级的值。这个孩子是充满活力的,可以处于任何深度。
我已经看到,这应该使用递归函数来完成。我在网上看到了一些指南,但似乎不是我所需要的。
有人可以帮我吗?
编辑:添加我的模型
class Type extends Model
{
public function parent()
{
return $this->belongsTo('App\Type', 'parent_id');
}
public function children()
{
return $this->hasMany('App\Type', 'parent_id');
}
public function childrenRecursive()
{
return $this->children()->with('childrenRecursive');
}
}
编辑2: 这是为了显示已接受答案中的(经过重构的)最终代码,希望这对以后的任何人都可以有所帮助:
public function buildCategoryTreeHtml($types)
{
$html = [];
if($types->count()){
$html[] = '<ul>';
foreach($types as $type) {
$html[] = sprintf(
'<li>%s%s</li>',
$type->name,
$this->buildCategoryTreeHtml($type->children)
);
}
$html[] = '</ul>';
}
return implode($html);
}
答案 0 :(得分:1)
我还没有实际测试过,但是例如,我有一种方法可以为类别树构建HTML。
public function buildCategoryTreeHtml($categories)
{
$html = [];
if(count($categories))
$html = ['<ul>'];
foreach($categories as $category) {
$html[] = sprintf(
'<li>%s %s</li>',
$category->name,
$this->buildCategoryTreeHtml($category->children);
);
}
$html = ['</ul>'];
}
return implode($html);
}
您当然需要将类别传递给它。
$categories = Category::with('childrenRecursive')
->whereNull('parent')
->get();
$html = $this->buildCategoryTreeHtml($categories);
这将以您想要的格式输出类别。让我知道是否可行:)