我试图弄清楚Laravel中的这些嵌套集是如何工作的。我在organizations
和departments
之间有很多联系。 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;
}
所以我的问题是,我应该如何从树状结构的部门中获取所有关系数据?
答案 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;
});