在Laravel中使用nestedset设计嵌套树形树

时间:2019-05-18 08:01:36

标签: php laravel nested

我试图弄清楚Laravel中的这些嵌套集是如何工作的。我在organizationsdepartments之间有很多联系。 organization可以有多个departments。一个部门可以有许多departments。为此,我正在使用Nestedsets

我想做的是从用户那里检索所有组织。关于此查询,我想检索附属于这些组织的所有部门。我想要这个结构,所以我的部门有一个无限的父级->子级关系,因此我可以使用treant.js来构建一个结构树。

我很确定我的数据库中的所有内容都正确构建,所以我的第一个想法就是使用with。但是似乎我只是生第一个孩子。这是一个示例:

$currentUser->organizations()->with(
            'departments.children',
            'departments.commodities',
            'departments.children.commodities',
        )->get()

我必须为每个嵌套部门包括children。[model]。因此,如果我有两个级别,则必须添加department.children.children.commodities,依此类推。这似乎很弱智!

我一直在尝试许多不同的方法来找到合适的解决方案,但是下面的解决方案是我目前最好的解决方案。我只是觉得我在使用nestedset-library错误。

public function getUserDepartmentTree() {
    foreach ( $this->organizations()->get() as $organization ) {
        $dep[] = $organization->departments()->get()->toTree();
    }

    return $dep;
}

所以我的问题是,我应该如何从树状结构的部门中获取所有关系数据?

1 个答案:

答案 0 :(得分:0)

为此,您将要使用descendants而不是children,因为children将仅返回直接/第一个子模型,而descendants将返回特定条件下的所有内容节点。

因为这会将关系添加为descendants而不是子关系,所以您需要对其进行一些微调,即更改关系的名称,然后使用toTree()方法:

$organizations = $currentUser->organizations()
    ->with('departments.commodities', 'departments.descendants.commodities')
    ->get()
    ->map(function ($organization) {
        $organization->departments->map(function ($department) {
            return $department->setRelation('children', $department->descendants->toTree())->unsetRelation('descendants');
        });

        return $organization;
    });