Symfony 语义错误-原则2.0

Symfony 语义错误-原则2.0,symfony,doctrine-orm,Symfony,Doctrine Orm,这些是我的桌子: Table Gift: -id -price ... 我已经编写了一个sql查询来获取特定夫妇的所有礼物信息 或 SELECT g.id , g.price, FROM gift g, registry reg WHERE reg.gift_id = g.id AND reg.couple_id = 1 我还想获得已购买礼物的总金额(如果有) 除总额(购买金额)

这些是我的桌子:

    Table Gift:
        -id 
        -price
        ... 




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



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


我还想获得已购买礼物的总金额(如果有)
除总额(购买金额)作为总贡献

我试过:

    $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.

首先,应该在联接后的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

    $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.
 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);