Doctrine Orm 2 使用本机 SQL 的递归查询

Posted

技术标签:

【中文标题】Doctrine Orm 2 使用本机 SQL 的递归查询【英文标题】:Doctrine Orm 2 Recursive query with Native SQL 【发布时间】:2017-04-29 20:28:20 【问题描述】:

我正在使用 symfony 框架,它使用 Doctrine Orm 2 和 DQL 与数据库通信。但是,DQL 不支持递归查询。它确实让您可以选择使用 Native SQL 和结果集映射来创建 DQL 不支持的高级查询。

现在到手头的任务。我正在尝试编写一个函数,当给定一个组 Id 时,我想返回该组的父 Id 和父 Id 的数组,直到我们到达父 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();

【问题讨论】:

***.com/a/24899603/460557 我去看看谢谢 那篇文章基本解决了谢谢老大 不过我得等两天 【参考方案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 子句。现在可以正常使用了。

【讨论】:

以上是关于Doctrine Orm 2 使用本机 SQL 的递归查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 Doctrine ORM 查询当天的生日

sql查询不适用于doctrine 2

如何在我的 symfony 项目中将 SQL Server 与 ORM Doctrine 连接起来?

使用 Doctrine ORM 的*** EXISTS 查询

原则:我可以使用 SQL 来创建我的表吗?

将原始 SQL 与 Doctrine 一起使用