【问题标题】:How to make JOIN with OR expression in DQL?如何在 DQL 中使用 OR 表达式进行 JOIN?
【发布时间】:2014-01-31 18:33:27
【问题描述】:

这是我期望从 Doctrine 获得的 SQL 等价物:

SELECT c.* FROM comments c
  LEFT JOIN articles a
    ON a.id = c.articles_id OR a.translation = c.articles_id
WHERE c.published = 1 AND c.language = a.language

问题是我不能让 Doctrine 使用 OR 生成 JOIN 操作,因为它应该是。如果我们从以下QueryBuilder 对象执行查询:

$qb->select('c')
   ->from('Project:Comment', 'c')
   ->leftJoin('c.article', 'a', 'WITH', 'a = c.article OR a.translation = c.article')
   ->where('c.published = true AND c.language = a.language');

我们收到以下 SQL 语句:

SELECT
  ...
FROM comments c0_ 
LEFT JOIN articles a0_ ON c0_.articles_id = a0_.id 
AND (
  a0_.id = c0_.articles_id OR
  a0_.translation = c0_.profiles_id
)
WHERE c0_.published = 1 AND c0_.language = a0_.language

这显然与初始查询不同,WITH 运算符似乎在基本条件的基础上添加了附加条件,而不是替换整个条件。

有什么方法可以强制 Doctrine 输出我需要的内容吗?我知道我可能会使用本机 SQL,但我怀疑它是否会像 QueryBuilder 一样方便。也许有一种方法可以用普通的JOIN ON 实现而不是这个奇怪的JOIN WITH 来扩展 Doctrine?

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    Doctrine 没有实现这一点,因为它(至少据我所知)被认为对 SQL 不够优化。

    See this SO post for precisions.

    您打算做的事情显然可以使用Union 和其他类型的Join 来完成。

    【讨论】:

    • 感谢您的回答。似乎Join..ORUnion 都不能被认为优化到足以在 Doctrine 中实现。这是否意味着除了原生 SQL 没有其他选择?
    • @VisioN 我确实这么认为。总的来说,我认为原生 SQL 在 90% 的情况下更优化,唯一的条件是一个人实际上知道如何编写适当的优化 SQL(这远非我的情况)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    相关资源
    最近更新 更多