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


また

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



また、購入したギフト (ある場合)
EX の合計金額も取得したいと考えています。私が試したtotalContributeとしてのSUM(purchase.amount)

:

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

1 に答える 1

2

まず、WHERE 句ではなく、結合後の SQL ステートメントで結合条件を定義する必要があります。その理由は、実際には効率的ではないからです。したがって、クエリは次のようになります。

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

しかし、Doctrine クエリについては、結合を間違った方法で定義しているため、エラーが発生します。クエリは次のようになります。

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

これを疑似コードとして扱ってください - 動作確認はしていませんが、もっと似ているはずです。

もう1つ-リポジトリメソッドがXエンティティのオブジェクトを返す場合、このメソッドをXRepositoryに配置する必要があります。

于 2012-10-15T07:42:33.877 に答える