大家好)我使用Laravel,MariaDB。
例如,我们有一个这样的表,比如说类别。
id | 名字 | _lft | _rgt | parent_id | 路径 | 是_文件夹 |
---|---|---|---|---|---|---|
1373 | Windows | 1 | 10 | 空 | 1373 | 1 |
1374 | 玻璃单元 | 2 | 7 | 1373 | 1373.1374 | 1 |
1375 | 配件 | 8 | 9 | 1373 | 1373.1375 | 1 |
1376 | 安装 | 3 | 4 | 1374 | 1373.1374.1376 | 0 |
1377 | 调整 | 5 | 6 | 1374 | 1373.1374.1377 | 0 |
类别模型使用 Kalnoy\Nestedset\NodeTrait 特征。 在下面的代码中,查询生成器已经包含基本过滤器(例如,按名称)
if (!empty($filters['recursiveSearch']) && CommonService::parseBoolean($filters['recursiveSearch']) === true) {
/** @var QueryBuilder $query */
}
传递recursiveSearch参数时,不仅要输出与过滤器匹配的值,还要输出它们的所有父项。
例如:通过过滤器名称=调整,我们得到字符串Adjustment。使用recursiveSearch,您还需要获得Windows和Glass unit。
查询还可以有一个过滤器parentId。如果
parentId=null&name=adjust&recursiveSearch=true
那么它应该返回 Windows
请帮忙:)
最初我只想做
with('ancestors')
,但结果进入了关系,并且应该在主查询中。
然后我进行了额外的查询,得到了第一个选择的结果,得到了
pluck('ancestors')
并且已经将它们的 ID 替换到结果查询中。它有效,但是如果在初始选择中有,例如,1000 条记录,每条记录有 3 个父项,那么最终将有 3000 个 ID。
作为一个想法,无需考虑 Laravel,您无需递归即可完成此操作,因为您拥有每一行的完整路径。
id | 名字 | _lft | _rgt | parent_id | 路径 | 是_文件夹 |
---|---|---|---|---|---|---|
1373 | Windows 1 | 10 | 空 | 1373 | 1 | |
1374 | 玻璃单元 | 2 | 7 | 1373 | 1373.1374 | 1 |
1375 | 配件 | 8 | 9 | 1373 | 1373.1375 | 1 |
1376 | 安装 | 3 | 4 | 1374 | 1373.1374.1376 | 0 |
1377 | 调整 | 5 | 6 | 1374 | 1373.1374.1377 | 0 |
select p.*
from categories c
left join categories p on
find_in_set(cast(p.id as char),replace(c.path,'.',','))>0
where c.id=1377
id | 名字 | _lft | _rgt | parent_id | 路径 | 是_文件夹 |
---|---|---|---|---|---|---|
1373 | Windows 1 | 10 | 空 | 1373 | 1 | |
1374 | 玻璃单元 | 2 | 7 | 1373 | 1373.1374 | 1 |
1377 | 调整 | 5 | 6 | 1374 | 1373.1374.1377 | 0 |