2

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

4

3 回答 3

1

这只是一个猜测,但评论太长了。如果我完全不在基地,我会删除这个答案。

假设您的本机查询在语法上是正确的,也许 MySQL 正在将最后一个ON条件应用于INNER JOINbetween band的结果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)。

于 2013-04-02T13:05:37.140 回答
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 不知道它们是如何相关的。但是,如果您基于属性进行 JOIN,Doctrine 可以使用注解(或其他映射)来确定 A 和 B 的关系。

于 2013-10-04T15:19:43.367 回答
0

在使用教义时,我总是不得不使用WITH关键字而不是。ON

于 2014-11-24T02:15:26.297 回答