当 child 为空时,Doctrine2 获得连接结果

Doctrine2 get join results when child is empty

我在 Symfony2 项目中使用 Doctrine2,我正在尝试优化查询和延迟加载。

我有两个实体 ParentChild

现在,如果在我的控制器中我检索到一个特定的 Parent 并通过视图(树枝)传递它,一切正常,但是当我想显示与 Child 相关的数据时,Doctrine2 使得另一个查询。

我尝试制作自己的 DQL 以仅在一个查询中获取所有内容(特定的 Parent 及其所有 Child。如果 Parent 至少有一个 Child,但如果没有 Child,我会得到一个空结果。

这是我的 DQL:

$dql = ' SELECT p, c
        FROM AppBundle:Parent p
        JOIN p.childs c
        WHERE p.id = :parentId
          AND c.state = :state';

解决方案:

$dql = 'SELECT p, c
            FROM AppBundle:Parent p
            LEFT JOIN p.childs c
            WHERE p.id = :parentId
              AND (c.state = :state' or c.state is null);

看看setFetchMode()。您可以告诉 doctrine 使用单个查询加载所有关联。

https://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#temporarily-change-fetch-mode-in-dql

编辑:您可以在 annotations as well 中设置抓取模式。

您只需要一个左连接而不是内连接:

SELECT p, c
    FROM AppBundle:Parent p
    JOIN p.childs c
    WHERE p.id = :parentId
      AND (c.state = :state or c.state is null)

这将基本上保留左侧 table(在本例中为父 table)的所有结果,并且仅保留右侧 table(子 table)的匹配结果 table)