我使用symfony框架并使用Doctrine Orm 2和DQL与数据库通信。但是,DQL不支持递归查询。它确实为您提供了使用Native SQL和结果集映射来创建DQL不支持的高级查询的选项。
现在到手头的任务。我正在尝试编写一个函数,当给定一个组ID时,我想返回该组的父ID和父母的Id的数组,直到我们到达具有一个组的根组parent Id等于NULL。例如,将3传递给函数将返回{3,2,1},传入2将返回{2,1},传入1将返回{1}。
我有一个分组表
| Group Id | Parent Id |
| 1 | NULL |
| 2 | 1 |
| 3 | 2 |
我目前解决此问题的方法是返回组ID的父级并一次又一次地查询数据库,直到我到达根组。但是,如果我可以在一个查询中完成所有这一切,那么服务器/数据库需要处理的开销要少得多。我对递归查询也不是很熟悉,但随着我对它们的了解,我会更新这篇文章。
更新1:这是我到目前为止的代码,我还必须更新到maria db 10.2,就像实现递归cte支持一样。我目前正在处理where子句中的语法错误。
public function getGroupOwnershipChain($group_id){
$rsm = new ResultSetMapping();
$rsm->addEntityResult('Bundle:Group', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'parent', 'parent');
$query = $this->em->createNativeQuery('
with recursive cte as (
SELECT u.id, u.parent
WHERE u.id = ?
FROM group
UNION ALL
SELECT e.id, e.parent
FROM cte c
JOIN group e ON e.id = c.parent
)
SELECT *
FROM cte;', $rsm);
$query->setParameter(1, $group_id);
return $query->getResult();
}
答案 0 :(得分:1)
public function getGroupOwnershipChain($group_id){
$rsm = new ResultSetMapping();
$rsm->addEntityResult('Bundle:Group', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'parent', 'parent');
$query = $this->em->createNativeQuery('
with recursive cte as (
SELECT u.id, u.parent
WHERE u.id = ?
FROM group
UNION ALL
SELECT e.id, e.parent
FROM cte c
JOIN group e ON e.id = c.parent
)
SELECT *
FROM cte;', $rsm);
$query->setParameter(1, $group_id);
return $query->getResult();
}
我不得不翻转递归锚点中的from和where子句。它现在运作正常。