2013-04-02 40 views
2

我有原生查询列是否有可能转换成DQL或学说查询生成器

A: 
    id 
B: 
    id 
    a_id 
C: 
    id 
    b.id 

3个表:

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

尝试将最后一个'ON'子句移动到'LEFT JOIN'子句后的适当位置。正如所写,它在语法上看起来不正确。 – BellevueBob

+0

是的,我已经尝试过。但与本机查询相比,我得到了不同的结果。根据https://groups.google.com/forum/#!topic/doctrine-user/0rNbXlD0E_8的 –

+0

,我认为不可能用Doctrine来做这个查询。 –

回答

1

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

假设你的本机查询语法正确,也许是MySQL是在打最后一次ON条件的INNER JOINbc之间的结果。如果这是真的,看看是否给你同样的结果:

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)。

+0

我没有运气,我尝试你的解决方案。它适用于原生SQL,但在DQL上没有运气。我得到了一个错误:Error:Class'('is not defined.Expectedly after“LEFT JOIN(”。I think doctrine join expression does not understand about what sub query,so it processing as like class/entity。 –

+1

Oh,对不起,正如我所说的那样,这只是一个猜测,我不知道学说,你可能想要删除MySQL标签并澄清你的问题,所以很显然你的问题只是在教义上,我会离开这个答案;可能 – BellevueBob

+0

已删除mysql标签感谢您的帮助,我很感激它:D –

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

当您刚刚将实体加入实体时,Doctrine不知道它们是如何相关的。但是,如果您基于属性加入,则Doctrine可以使用注释(或其他映射)来确定A和B的关系。

+0

也许我错了解释你的答案。但是如何能够查询一个实体,并将其与属性留在一起呢?对不起,迟到了。 –

0

使用原则时,我一直必须使用WITH关键字而不是ON

+0

给我更详细的解释。 –

+0

除了DQL似乎使用'WITH'关键字而不是'ON'之外,我对此不甚了解。在MySQL中,我会在DQL中使用'ON',我使用'WITH' – Henry