2013-07-19 125 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