2013-04-24 106 views
1

我有2個與ManyToMany關係鏈接的Doctrine表。Doctrine 2,ManyToMany搜索

表:項

表:標籤

我希望能夠找到有多個或一個標籤(S)每標籤,我輸入匹配的條目。

例如:En條目「foo」具有標籤「1」和「2」。如果我試圖通過標籤「1」找到每個條目,我找到這個條目,如果我再次搜索「1」和「2」,我再次找到它,但是如果我添加了對標籤「3」的搜索, ,那麼該值不匹配。

到目前爲止,我發現了一些簡單的方法來實現這樣的事情,但它並沒有給我我想要的結果,我真的不知道我怎麼能用Doctrine 2進行這種搜索。

通常我會用關係表來做到這一點,但我不知道在Doctrine下是否有可能。

回答

1

不是真的知道如果我的理解,但嘗試,如果這個工程:

//class EntryRepository 

public function yourFunction($tags) 
{ 
    return $this->createQueryBuilder("o") 
     ->innerJoin("o.Tags", "t", "WITH", "t.name IN :tags") 
      ->setParameter("tags", $tags) 
     ... 
} 

這將返回在$標籤陣列標籤的至少一個條目。如果這是你想要的,你也可能會

->addSelect("COUNT(t.id) as HIDDEN relevance")->groupBy("o.id") 
->orderBy("relevance") 

這將在多少標籤匹配順序返回結果玩,但我沒有測試它。

+0

這是用於OR。它將匹配任何至少有一個標籤的條目。我想要的是一個AND,它將返回包含所有標籤的所有條目。我現在的工作是每個標籤1 INNER JOIN。但如果有的話,我會尋找更好的解決方案。 (並感謝相關的東西,將其用在其他地方!) – Manhim 2013-04-25 19:05:59

+0

好吧,我現在明白你想要什麼。 afaik,你不能做得更簡單,使用子查詢會使代碼更難讀。但即使你這樣做,那麼你也會失去「orderBy(相關性)」,因爲查詢會返回匹配所有標籤的結果。 – Zeljko 2013-04-26 13:08:29