【问题标题】:Doctrine2 get join results when child is empty当孩子为空时,Doctrine2 得到连接结果
【发布时间】:2016-02-16 07:47:36
【问题描述】:

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

我有两个实体 ParentChild

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

我尝试创建自己的DQL 以仅在一个查询中获取所有信息(特定的Parent 及其所有Childs。如果Parent 至少有一个@987654330,则一切正常@, 但是如果没有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);

【问题讨论】:

  • c.state = :state 如果没有孩子,总是会失败。因此没有记录。
  • 你是对的!谢谢!
  • 请不要在标题和问题的答案中添加SOLVED。您应该接受任何对您有帮助的答案,看起来您从 sagi 复制粘贴了答案。见How does accepting an answer work?
  • 对不起!我不知道!谢谢!我应该删除标题中的解决方案吗?雷加萨

标签: php sql symfony doctrine-orm dql


【解决方案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)

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

【讨论】:

  • 谢谢,我试过这个选项,但我不知道为什么,好吧,当然我做错了什么,它没有工作。我再试一次!
  • 顺便说一句,别名部分 LEFT JOIN P.child c 似乎有点奇怪.. P 是另一个表的别名@Plagueis
  • 也许这就是问题所在...我应该使用 LEFT JOIN c.parent p 吗?
  • 现在试试@Plagueis
  • Doctrine 的 DQL 不是 SQL。您发布的内容将不起作用。投反对票。
【解决方案2】:

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

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

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

【讨论】:

  • 哇。我不知道这个选项。我试试,好像很干净!
  • 您的解决方案有效,但如果我想要多个关系,我应该怎么做?
  • 然后为每个关联多次调用该函数。
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多