2012-10-14 62 views
0

这些都是我的表:语义错误 - 学说2.0

Table Gift: 
     -id 
     -price 
     ... 


Table Couple: 
     -id 
     -name 
     ... 


table registry: //provide a many-many relation between gifts and couples 
     -id 
     -coupleId 
     -giftId 


table purchase: 
     -amount 
     -registryId 


我已经写了一个SQL查询来获取所有的礼物信息特定夫妇

$qb = $this->createQueryBuilder('g') //gift 
    ->from('\BBB\GiftBundle\Entity\Registry', 'reg') 
    ->select('g.id , g.price') 
    ->where('reg.gift = g.id') 
    ->andWhere('reg.couple = :coupleID') 
    ->orderBy('reg.id','DESC') 
    ->setParameter('coupleID', $coupleID); 


OR

 SELECT g.id , g.price, 
    FROM gift g, registry reg  
    WHERE reg.gift_id = g.id AND reg.couple_id = 1 



我也想至获得已购买礼品的总金额(如有)
EX。 SUM(purchase.amount)作为totalContribute

我曾尝试:

$qb = $this->createQueryBuilder('g') 
    ->from('\BBB\GiftBundle\Entity\Purchase', 'p') 
    ->from('\BBB\GiftBundle\Entity\Registry', 'reg') 
    ->select('g.id , g.price') 
    ->addSelect('SUM(p.amount) as totalContribute') 
    ->leftJoin('p','pp', 'ON','reg.id = pp.registry') 
    ->where('reg.gift = g.id') 
    ->andWhere('reg.couple = :coupleID') 
    ->orderBy('reg.id','DESC') 
    ->setParameter('coupleID', $coupleID); 

,但它给了我下面的错误:

[Semantical Error] line 0, col 145 near 'pp ON reg.id': Error: Identification Variable p used in join path expression but was not defined before. 

回答

1

首先,你应该定义在连接条件的连接后的SQL语句,不在WHERE子句中。原因是它真的没有效率。因此,查询建议立即进行删除样子:

SELECT g.id , g.price, 
FROM gift g JOIN registry reg ON reg.gift_id = g.id 
WHERE reg.couple_id = 1 

但你的学说查询时,你得到错误,因为你定义在错误的方式连接。您的查询应该更像:

$qb = $this->createQueryBuilder('g') // You don't have put "from" beacuse I assume you put this into GiftRepository and then Doctrine knows that should be \BBB\GiftBundle\Entity\Gift 
    ->select('g.id , g.price') 
    ->addSelect('SUM(p.amount) as totalContribute') 
    ->join('g.purchase','p')   // pay attention for this line: you specify relation basing on entity property - I assume that is "$purchase" for this example   
    ->leftJoin('p.registry', 'reg') // here you join with \BBB\GiftBundle\Entity\Purchase 
    ->where('reg.couple = :coupleID') 
    ->orderBy('reg.id','DESC') 
    ->setParameter('coupleID', $coupleID); 

请将此视为伪 - 我没有检查它的工作原理,但它应该更喜欢这样。

还有一件事 - 如果您的存储库方法返回X实体的对象,则应该将此方法放入XRepository。