我有3个表格列
A:
id
B:
id
a_id
C:
id
b.id
使用原生查询:
SELECT a.id, b.id, c.id
FROM A as a
LEFT JOIN B as b
INNER JOIN C as c ON b.id = c.b_id
ON a.id = b.a_id
我试过了
SELECT a.id, b.id, c.id
FROM App\HomeBundle\Entity\A as a
LEFT JOIN App\HomeBundle\Entity\B as b
INNER JOIN App\HomeBundle\Entity\C as c
ON c.id = c.bId
ON a.id = b.aId
我收到了错误:
Error: Expected Literal, got 'JOIN'
是否可以将我的原生查询转换为DQL或查询构建器?如果可能的话,它会是什么样子?
答案 0 :(得分:1)
这只是猜测,但评论时间太长。如果我完全偏离基础,我会删除这个答案。
假设您的本机查询在语法上是正确的,那么MySQL可能会将最后ON
条件应用于INNER JOIN
和b
之间c
的结果。如果这是真的,看看这是否给你相同的结果:
SELECT a.id, b.id, c.id
FROM App\HomeBundle\Entity\A as a
LEFT JOIN (
SELECT bx.aID
FROM App\HomeBundle\Entity\B as bx
INNER JOIN App\HomeBundle\Entity\C as c
ON bx.id = c.bId
) b
ON a.id = b.aId
注意我更正了我认为您尝试的解决方案中的错误(您说ON c.id = c.bId
)。
答案 1 :(得分:0)
这是一个较旧的问题,但我相信你需要加入关系,而不是实体。
例如,而不是
SELECT a
FROM Entity\A as a
LEFT JOIN Entity\B as b
应该是:
SELECT a
FROM Entity\A as a
LEFT JOIN a.entityB as b
如果不清楚,a.entityB是A实体的属性,称为“entityB”。该属性定义了A和B之间的关系。
当你只是将实体加入实体时,Doctrine不知道它们是如何相关的。但是,如果基于属性加入,则Doctrine可以使用注释(或其他映射)来确定A和B的关系。
答案 2 :(得分:0)
在使用原则时,我总是必须使用WITH
关键字而不是ON
。