Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5.7:如何从嵌套的雄辩关系中递归获取属性?_Php_Laravel - Fatal编程技术网

Php Laravel 5.7:如何从嵌套的雄辩关系中递归获取属性?

Php Laravel 5.7:如何从嵌套的雄辩关系中递归获取属性?,php,laravel,Php,Laravel,首先,我对在模型中建立关系没有任何问题 我有一个WebGroup模型,它可以有无限的父WebGroup(s)和无限的子WebGroup(s) 家长关系: 子女关系: 我可以通过:$WebGroup->children获得给定WebGroup的所有子项的嵌套集合 这给了我: 它是嵌套的,它是无限的。好极了但是现在我如何递归地循环该集合并递归地获得给定属性的扁平数组呢。例如,每个WebGroup模型都有一个name属性 如何递归地获取所有网络组的给定集合的所有名称从父组开始,到兔子洞下的所有子组?

首先,我对在模型中建立关系没有任何问题

我有一个
WebGroup
模型,它可以有无限的父
WebGroup
(s)和无限的子
WebGroup
(s)

家长关系:

子女关系:

我可以通过:
$WebGroup->children
获得给定
WebGroup
的所有子项的嵌套集合

这给了我:

它是嵌套的,它是无限的。好极了但是现在我如何递归地循环该集合并递归地获得给定属性的扁平数组呢。例如,每个
WebGroup
模型都有一个name属性


如何递归地获取所有
网络组的给定集合的所有名称
从父组开始,到兔子洞下的所有子组?

好的,我自己写了这个

private function getNestedChildrenByWebGroup(WebGroup $webGroup): Collection
{
    $data = collect([]);

    foreach ($webGroup->children as $child) {
        $data->push($child->webgroup);

        // If child has it's own children…
        if ($child->children instanceof Collection) {

            // Recursive call to all children of a child
            foreach ($child->children as $childWebGroup) {
                $this->getNestedChildrenByWebGroup($childWebGroup);
                $data->push($childWebGroup->webgroup);
            }
        }
    }

    return $data;
}
数据库结构

最终结果:


使用appends变量执行此操作的最简单方法。使用这样的mutator获取子数据

public function getChildrenAttribute()
{
    return $this->hasMany(Category::class,'parent_id')->get();
}
然后使用appends变量

protected $appends = ['children'];
然后调用函数

Category::find($id)

您的答案将只显示两个级别的子项。但它不会显示父代的所有子代。你完全错了。想知道是不是你否决了我的问题?您可以使用('children')定义
子项与
->的关系,然后在重复中获取子项,这将在假设数据库结构正确的情况下提供无限嵌套的结果。仔细检查您的代码和数据。干杯。@Jearson注意到getNestedChildrenByWebGroup如何称呼自己……不,我没有这么做。
protected $appends = ['children'];
Category::find($id)