首页 > 解决方案 > 在 Laravel 中使用 nestedset 设计嵌套的树形树

问题描述

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

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

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

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

我必须为每个嵌套部门包括 children.[model]。所以如果我有两个级别,我必须添加部门.children.children.commodities 等等。这似乎相当落后!

我一直在尝试很多不同的方法来获得合适的解决方案,但下面的一个是我目前最好的解决方案。我只是觉得我使用错误的嵌套集库。

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

    return $dep;
}

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

标签: phplaravelnested

解决方案


为此,您将要使用descendants而不是childrenaschildren只会返回直接/第一个子模型,而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;
    });

推荐阅读