2016-12-30 8 views
1

双方向のManyToMany関係でリンクされた2つのエンティティ(Item & Tag)があります。実際に使用されているエンティティ(Tag)レコードを表示したいと思います他のエンティティ(項目):ここでManyToMany Doctrineの関係で使用するアイテムを選択する方法

は私のアイテムの実体である:

class Item 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Tag", inversedBy="items") 
    */ 
    private $tags; 
} 

そして、私のタグenity:012:私はこれを試してみた私のタグリポジトリの今

class Tag 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Item", mappedBy="tags") 
    */ 
    private $items; 
} 
class TagRepository extends \Doctrine\ORM\EntityRepository 
{ 
    public function findAllUsed() 
    { 
     return $this->createQueryBuilder('t') 
      ->leftJoin('t.items', 'items') 
      ->groupBy('items.id') 
      ->having('COUNT(t.id) > 0') 
      ->orderBy('t.name', 'ASC') 
      ->getQuery() 
      ->getResult(); 
    } 
} 

しかし、私が期待している結果は得られません。だれでも助けてくれますか?ありがとう!

答えて

1

問題

私がテストしていないが、あなたのエラーがカウント節にあるようです。あなたはタグを数えていますhaving('COUNT(t.id) > 0')。したがって、すべてのタグが返されます。 もう1つのエラーは「アイテム」でグループ化し、「t」だけを選択していることです。グループでは必要ありません。

ソリューション句を持つの 'アイテム' の変更]タグの

public function findAllUsed() 
{ 
    return $this->createQueryBuilder('t') 
     ->leftJoin('t.items', 'items')    
     ->having('COUNT(items.id) > 0') 
     ->orderBy('t.name', 'ASC') 
     ->getQuery() 
     ->getResult(); 
} 

もう一つの可能​​な方法よりシンプルで@KevinTheGreatようinnerJoinを行うが、チェックは持つ必要はありませんか、WHERE句、それ以上:

public function findAllUsed() 
{ 
    return $this->createQueryBuilder('t') 
     ->innerJoin('t.items', 'items')   
     ->orderBy('t.name', 'ASC') 
     ->getQuery() 
     ->getResult(); 
} 
+1

2番目のソリューションはシンプルで簡単です!私はもう少し私のSQL言語を勉強する必要があります...ありがとうVinicius! – VinZ

1

私は私の頭の上からこれをしたが、それは動作するはずです、私の代わりにleftJoinのinnerJoinを使用して、あなたがリンクされているレコードを取得することを確認する場所を追加しました:

public function findAllUsed() 
    { 
     return $this->createQueryBuilder('t') 
      ->innerjoin('t.items', 'i') 
      ->groupBy('i.id') 
      ->where('i.id = t.items') 
      ->having('COUNT(t.id) > 0') 
      ->orderBy('t.name', 'ASC') 
      ->getQuery() 
      ->getResult(); 
    } 
} 

私は答えを定式化するために、この例を使用:Query on a many-to-many relationship using Doctrine with Symfony2

+0

私はエラー "『BY項目のGROUP』を持っています:エラー:無効なPathExpression。StateFieldPathExpressionまたはSingleValuedAssociationFieldが必要です。今。 – VinZ

+0

-groupBy( '​​items.id')を( 'i.id')に変更しました – KevinTheGreat

+0

あなたは少し冗長です。 'where( 'i.id = t.items')'はすでに内部結合に含まれているからです。 –

関連する問題