这是我期望从学说获得的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
问题在于,我无法像应该使用的是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
操作员似乎在基本条件上添加了其他条件,而不是更换整个条件。
是否有任何方法可以强迫学说准确地输出我需要的东西?我知道我可以使用本机SQL,但我怀疑它会和QueryBuilder
一样方便。也许有一种方法可以通过普通的JOIN ON
实现来扩展学说,而不是此奇数JOIN WITH
?
学说无法实现此功能,因为它(据我所知,至少)对SQL的优化不够优化。
请参阅此帖子。
您打算使用Union
和其他类型的Join
。