我在Symfony2项目中使用Doctrine2,我试图优化查询和延迟加载。
我有两个实体Parent
和Child
。
现在,如果在我的控制器中我检索到一个特定的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';
答案 0 :(得分:1)
看看setFetchMode()
。您可以告诉doctrine使用单个查询加载所有关联。
编辑:您可以在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)
这基本上会保留左表的所有结果(在本例中为父表),并且只保留右表(子表)的匹配结果