是否可以转换为DQL或Doctrine Query Builder

时间:2013-04-02 12:16:48

标签: doctrine-orm doctrine query-builder

我有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或查询构建器?如果可能的话,它会是什么样子?

3 个答案:

答案 0 :(得分:1)

这只是猜测,但评论时间太长。如果我完全偏离基础,我会删除这个答案。

假设您的本机查询在语法上是正确的,那么MySQL可能会将最后ON条件应用于INNER JOINb之间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