用天然SQL的学说ORM 2递归查询



我正在使用Symfony框架,并且使用Doctrine Orm 2和DQL与数据库进行交谈。但是,DQL不支持递归查询。它确实使您可以选择使用本机SQL以及结果集映射来创建DQL不支持的高级查询。

现在要完成的任务。我正在尝试编写一个函数,当给定一个组ID时,我想返回组的父id和父级的一个属数数组,直到我们以等于null的父ID到达root组。例如,将3传递给函数将返回{3,2,1},通过2返回{2,1},然后以1返回1将返回{1}。

我有一个组表

| Group Id | Parent Id |
|    1     |    NULL   |
|    2     |      1    |
|    3     |      2    |

我当前对此问题的解决方案只是返回组ID的父,并一次又一次地查询数据库,直到我到达根组。但是,如果我可以在一个查询中完成这一切,那么服务器/db要照顾的开销要少得多。我也不熟悉递归查询,但是随着我了解更多信息,我会以自己的进度更新这篇文章。

更新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();
}
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();
}

我不得不在递归锚点中翻转从递归和其中的子句中翻转。它现在可以。

相关内容

  • 没有找到相关文章