SQL/Laravel:在树数据结构中获取父级

问题描述 投票:0回答:1

大家好)我使用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,您还需要获得WindowsGlass unit


查询还可以有一个过滤器parentId。如果

parentId=null&name=adjust&recursiveSearch=true
那么它应该返回 Windows

请帮忙:)

最初我只想做

with('ancestors')
,但结果进入了关系,并且应该在主查询中。

然后我进行了额外的查询,得到了第一个选择的结果,得到了

pluck('ancestors')
并且已经将它们的 ID 替换到结果查询中。它有效,但是如果在初始选择中有,例如,1000 条记录,每条记录有 3 个父项,那么最终将有 3000 个 ID。

php sql laravel tree
1个回答
0
投票

作为一个想法,无需考虑 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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.