当 child 为空时,Doctrine2 获得连接结果
Doctrine2 get join results when child is empty
我在 Symfony2 项目中使用 Doctrine2,我正在尝试优化查询和延迟加载。
我有两个实体 Parent
和 Child
。
现在,如果在我的控制器中我检索到一个特定的 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 使用单个查询加载所有关联。
编辑:您可以在 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)
我在 Symfony2 项目中使用 Doctrine2,我正在尝试优化查询和延迟加载。
我有两个实体 Parent
和 Child
。
现在,如果在我的控制器中我检索到一个特定的 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 使用单个查询加载所有关联。
编辑:您可以在 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)