当子项为空时,Doctrine2会获得联接结果

时间:2016-02-16 07:47:36

标签: php sql symfony doctrine-orm dql

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

我有两个实体ParentChild

现在,如果在我的控制器中我检索到一个特定的Parent并将其传递给一个视图(twig),一切正常,但是当我想显示与Child相关的数据时,Doctrine2会生成另一个查询。

我试图让我自己的DQL只在一个查询中获得所有查询(具有Parent所有内容的特定Child。如果{{{}} { {1}}至少有一个Parent,但如果没有任何Child,我会获得空结果。

这是我的Child

DQL

解决方案:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

这基本上会保留左表的所有结果(在本例中为父表),并且只保留右表(子表)的匹配结果