我有一个名为Source
的模型,其中包含parent_id
列。每个源都可以有parent_id
,层次结构是无限的。如果Source
没有parent_id
,那么它就是根。
现在,我的模型中目前有以下方法:
public function parent()
{
return $this->hasOne('App\Source', 'id', 'parent_id');
}
public function children()
{
return $this->hasMany('App\Source', 'parent_id')->orderBy('name');
}
我没有问题获得一个很好的孩子名单,例如:
$parents = Source::with('children')->whereNull('parent_id')->orderBy('name')->get();
$traverse = function ($parents, $prefix = '') use (&$traverse) {
foreach ($parents as $parent) {
echo '<option value="'.$parent->id.'">'.$prefix.$parent->name.'</option>';
$traverse($parent->children, $prefix.'- ');
}
};
$traverse($parents);
我的问题是我想获得一个完整的模型名称字符串及其父名称。
所以说我有以下来源:
Parent 1
- Child 1
- - Subchild 1
- - Subchild 2
- Child 2
我正在尝试创建一个函数,在Parent 1 - Child 1 - Subchild 1
Subchild 1
这是我尝试过的,它似乎只给了我最高级别的父级名称:
public static function treeName(Source $source, &$tree)
{
if ($source->parent) {
$tree[] = self::treeName($source->parent, $tree);
}
else {
$tree[] = $source->name;
}
}
$source = Source::where('name', 'Subchild 1')->first();
$tree = [];
Source::treeName($source, $tree);
Log::info($tree);
这给了我:
[2018-04-25 23:02:25] laravel.INFO: array (
0 => 'Parent 1',
1 => NULL,
2 => NULL,
)
我可以简单地通过-
内爆数组,但数组并没有给我我想要的东西。我怎样才能让它发挥作用?
这就是我想要的:
array (
0 => 'Parent 1',
1 => 'Child 1',
2 => 'Subchild 1',
)
答案 0 :(得分:0)
这可以在数组中获得所需的结果:
function toArray($child) {
$tree = [];
while($child) {
// Prepand the name to the front of the array
array_unshift($tree, $child->name);
// Overwrites `$child` with it's parent, for next iteration
// If the parent doesn't exist, $child will be null
// which will also end the `while` loop
$child = $child->parent;
}
return $tree;
}
将孩子的对象传递给它,然后它将返回该阵列。