2012-01-21 7 views
16

これは基本的な要求のように思えるかもしれませんが、私はそれを動作させるように見えないので、私は何か愚かなものを紛失しているか、それをどうやってやるべきかを理解していません。前もって感謝します。Doctrine 2.1 DQL - 多対多問合せの複数の値 - 複数のカテゴリの項目?

多対多の関係を持つ2つの教義エンティティがあります:項目とカテゴリ。 items_has_categoriesによって結合されます。

/** 
* Item 
* 
* @Table(name="items") 
* @Entity(repositoryClass="Entity\Repository\Item") 
*/ 
class Item 
{ 

.... 

/** 
* @var Categories 
* 
* @ManyToMany(targetEntity="Categorie", inversedBy="items", cascade={"persist"}) 
* @JoinTable(name="items_has_categories", 
* joinColumns={ 
*  @JoinColumn(name="items_id", referencedColumnName="id") 
* }, 
* inverseJoinColumns={ 
*  @JoinColumn(name="categories_id", referencedColumnName="id") 
* } 
*) 
*/ 
private $categories; 

.... 
} 

/** 
* Categorie 
* 
* @Table(name="categories") 
* @Entity(repositoryClass="Entity\Repository\Categorie") 
*/ 
class Categorie 
{ 
..... 

/** 
* @var Items 
* 
* @ManyToMany(targetEntity="Item", mappedBy="categories") 
*/ 
private $items; 

.... 
} 

そして、私はすべてのカテゴリの「X」の数の中にあるすべてのアイテムを返すためにクエリを実行されてやろうとしている - 私は/思考はSELECTとし、AND句であるべきだと思う:

をコードの少しはエラーがないと(:$カテゴリ2つのカテゴリは、アレイに送信されます):以下のDQL SELECTクエリを出してくれること
class Item extends EntityRepository 
{ 
    public function findItemsByCategories($categories) 
    { 

    $qString = 'SELECT j, t, c FROM Technique\Entity\Item j LEFT JOIN j.itemImages t JOIN j.categories c WHERE'; 

    $i = 0; 
    foreach ($categories as $c) 
    { 
     $qString .= ' c.name = ?' . $i; 

     if ($i < (count($categories)-1)) 
     { 
      $qString .= ' AND'; 
     } 
     $i++; 
    } 

    $query = $this->_em->createQuery($qString); 
    $query->setParameters($categories); 

    return $query->getResult(); 
} 

SELECT j, t, c FROM Technique\Entity\Item j LEFT JOIN j.itemImages t JOIN j.categories c WHERE c.name = ?0 AND c.name = ?1 

これは常に空の配列を返します、結果がないs。私のDBには、基準に適合する20以上のアイテムがありますが、どちらのカテゴリにもあります。

誰でも私がここで間違っているのを見てください。これはAND選択であるはずです...?基本的には、Doctrine 2+の多対多の関係を照会する方法を知りたいのですが、複数の値が一致する必要がある複数の値があります。

答えて

40

興味のある方は、 )。 Doctrineは、DQLページの1行ではなく、これを実際に説明する必要があります。

基本的にANDクエリではなく、MEMBER OF ANDクエリです。カテゴリごとのメンバーが作成しておく必要があり、その後、ANDと全体のクエリに追加:要求されたすべてのカテゴリ内にあるすべてのアイテムを返します

SELECT j, t FROM Entity\Item j LEFT JOIN j.itemImages t WHERE ?0 MEMBER OF j.categories AND ?1 MEMBER OF j.categories AND ?2 MEMBER OF j.categories, etc. 

こと。

+1

あなたの検索結果を共有していただきありがとうございます。私は非常に似たような問題をあきらめようとしていましたが、MEMBER OFはそのトリックを行いました。あなたに最高です。 –

+1

最後にこれを行う良い方法。 MEMBER OFは本当にもっと文書化されるべきです。それが存在していたことさえ知りませんでした。どうもありがとう。 – ZolaKt

+1

私の実験から、このメソッドは複数のサブクエリを実行させます。 DQLがそれを受け入れるならば、サブクエリとIN()を使うWHERE節ではるかに良いでしょう。これがDQLでも動作する場合は、私は実験して回答を投稿します。 – Lewis

関連する問題