Doctrine orm 是否可以转换为DQL或条令查询生成器

Doctrine orm 是否可以转换为DQL或条令查询生成器,doctrine-orm,doctrine,query-builder,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

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

这只是一个猜测,但对于评论来说太长了。如果我完全错了,我会删除这个答案

假设您的本机查询在语法上是正确的,那么MySQL可能正在对
b
c
之间的
内部联接的结果应用最后一个
ON
条件。如果这是真的,看看这是否会给你同样的结果:

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

注意:我纠正了我认为您尝试的解决方案中的错误(您在c.id=c.bId上说了
)。

这是一个老问题,但我认为您需要加入关系,而不是实体

例如,代替

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是一个实体的属性,称为“entityB”。该属性定义了A和B之间的关系


当你们只是一个实体接一个实体的时候,条令并不知道它们是如何关联的。但是,如果您基于属性加入,则可以使用注释(或其他映射)为了确定A和B的关系。

在使用条令时,我总是必须使用
WITH
关键字,而不是
ON
上的

尝试将
上的最后一个
子句移动到
左JOIN
子句后的适当位置。正如所写的,它在语法上看起来不正确。是的,我已经试过了。但我得到的结果与本机查询不同。根据,我认为用条令进行此查询是不可能的。我运气不好,我尝试了你的解决方案。它可以在本机SQL上工作,但在DQL上没有成功。我得到一个错误:错误:类“(”未定义。正好在“左连接(”。我认为doctrine join表达式不了解子查询是什么,所以它像类/实体一样处理。哦,抱歉。正如我所说,这只是一个猜测;我不知道doctrine。您可能需要删除MySQL标记并澄清您的问题,以便清楚您的问题只与doctrine有关。无论如何,我会留下这个答案;可能会帮助某人else with a real solution.mysql标记已删除。感谢您的帮助。我对此表示感谢。:DI也尝试加入select语句的结果,但它在DQL中不起作用。我相信这是因为DQL是一种实体查询语言,用于与彼此相关的实体交互,不允许使用temp tab的原始查询les等。请看我的相关问题:也许我对你的答案的解释是错误的。但是,如何查询一个与属性本身连接的实体呢?很抱歉,响应太晚了。请给我更详细的解释。除了DQL似乎使用
with
关键字,而不是
ON
。在MySQL中,我会使用
<代码>打开
在DQL中,我将