2013-07-19 122 views
1

我有兩個實體:CategoryIcon他們有一個多對多的關係,所以我最終有三個表:categoryiconicon_categoryDoctrine2如何比較兩個結果集

我的目標是要找到在圖標多個類別。

例如我有以下

類別:abc和圖標123

以下是類別的圖標:

1 - ab

2 - a

3 - c

我想,以搜索爲a類別和b圖標,並得到1作爲結果。

我的第一種方法是在每個類別(ab)爲單獨的結果加載,然後比較使用array_intersect()

$cats = array(); 

    foreach($terms as $term){ 
     $cat = $em->getRepository('SixStringPearBundle:Category')->findOneBy(array("name" => $term)); 
     if($cat){ 
     $cats[$term] = $cat->getIcons(); 
     } 
    } 

這回$cats[a] = array(icon(1), icon(2)$cats[b] = array(icon(1))

然後我嘗試了以下內容:

$res = array_shift($cats); 
    foreach($cats as $cat){ 
     $res = array_intersect($res, $cat); 
    } 

但出現以下錯誤:Argument #1 is not an array

我檢查的$cat[a]$cat[b]的類型和他們是一個原則持久性集合

我也打過電話$res = $res->toArray()$cat = $cat->toArray()調用array_intersect之前,這解決了錯誤,但沒有返回預期的結果:Icon(1)

有沒有人有任何想法或甚至更好的方法來解決這一切?

+0

爲什麼你不想使用DQL:'... WHERE icon.category(a,b)'? – meze

+0

我試過這個爲我的查詢:'選擇我從SixStringPearBundle:圖標我在哪裏i.categories IN(1,2)'和我得到以下錯誤:類別IN:錯誤:無效PathExpression。 StateFieldPathExpression或SingleValuedAssociationField expected.''(1,2)'指的是類別標識 –

+0

' WHERE IDENTITY(i.categories)IN'。 – meze

回答

1

我結束了使用原則查詢生成器。這是痛苦的,但我終於搞清楚了。這裏是最終結果:

$qb->select('i') 
    ->from('SixStringPearBundle:Icon', 'i') 
    ->leftJoin('i.categories', 'c') 
    ->where('c.name IN (?1)') 
    ->groupBy('i.id') 
    ->having('count(i.id) = ?2') 
    ->setParameters(array(1 => $terms, 2 => count($terms))); 
+0

最好對所有輸入使用佔位符參數。 – meze

+0

你在說什麼:'$ qb-> orWhere('c.name = \''。$ term。'\'');'?我不確定如何添加一個佔位符,因爲它在foreach內部,並且有一個未知數 –

+0

這就是您可以使用'IN'的地方:'$ qb-> orWhere('c.name IN(?1 )') - > setParameter(1,$ terms); ... - >有('count(i.id)=?2')...'(需要教條> = 2.1)。 – meze