php - 在 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;
}
所以我的问题是,我应该如何从我的部门树状结构中获取所有关系数据?
解决方案
为此,您将要使用descendants
而不是children
aschildren
只会返回直接/第一个子模型,而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;
});
推荐阅读
- python - 将函数应用于 ndarray && 的行将 itertool 对象转换为 numpy 数组
- javascript - 项目删除时自动更新组件
- vim - vimrc通过系统命令引用python3路径
- flutter - Flutter UI 对角滚动与 snap
- vb.net - 如何使用 datetimepicker 进行 sql 搜索查询
- javascript - 检测是否通过 getter 查看图像(在控制台中)
- angular - 在 Angular 路由中使用泛型
- powershell - 获取 csv 文件夹列表中每个子文件夹的 LastAccessTime
- aws-lambda - 从 AWS Lambda 调用 cloudwatch 规则
- python - Python Behave 可选参数