2012-01-21 35 views
16

這可能看起來像一個基本的要求,但我似乎無法得到它的工作,所以我要麼失去了一些愚蠢的東西,要麼不瞭解應該如何去做。提前致謝。Doctrine 2.1 DQL - 多對多查詢多個值 - 多個類別中的項目?

我有兩個多對多關係的學說實體:項目和類別。由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」號的所有項目 - 我認爲/以爲應該是選擇具有與AND子句:

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

這代碼一點沒有錯誤,並吐出了以下DQL SELECT查詢時(2類數組中發送:$類):

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 

這總是返回一個空數組,即沒有結果秒。即使在我的數據庫中,有超過20個符合條件的項目:都屬於這兩個類別。

有人看到我在這裏做錯了嗎?這應該是一個AND選擇...?基本上我只是想知道如何查詢2++原則中的多對多關係,其中有多個必須滿足的值...

回答

40

對於任何感興趣的人,我想出了它(痛苦地)。學說應該更好地解釋這一點,而不是他們在DQL頁面上的那一行......

基本上它不是一個AND查詢,它是一個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

最後一個很好的方法來做到這一點。成員真的應該更多地記錄。甚至不知道它存在。非常感謝。 – ZolaKt

+1

從我的實驗中,這種方法會導致運行多個子查詢。如果DQL接受它,用子查詢和使用IN()的WHERE子句會更好。如果這仍然適用於DQL,我會試驗併發布答案。 – Lewis