Doctrine orm Doctrine2如何比较两个结果集

Doctrine orm Doctrine2如何比较两个结果集,doctrine-orm,Doctrine Orm,我有两个实体:Category和Icon,它们有一个多对多的关系,所以我最终得到了三个表:Category Icon和Icon\u Category 我的目标是找到多个类别的图标 例如,我有以下几点 类别:a b c和图标1 2 3 以下是图标的类别: 1-a b 2-a 3-c 我想搜索类别a和b中的图标,结果是1 我的第一种方法是将每个类别a和b加载到单独的结果中,然后使用array_intersect进行比较: 这将返回$cats[a]=arrayicon1、icon2和$cats[b]=

我有两个实体:Category和Icon,它们有一个多对多的关系,所以我最终得到了三个表:Category Icon和Icon\u Category

我的目标是找到多个类别的图标

例如,我有以下几点

类别:a b c和图标1 2 3

以下是图标的类别:

1-a b

2-a

3-c

我想搜索类别a和b中的图标,结果是1

我的第一种方法是将每个类别a和b加载到单独的结果中,然后使用array_intersect进行比较:

这将返回$cats[a]=arrayicon1、icon2和$cats[b]=arrayicon1

然后我尝试了以下方法:

    $res = array_shift($cats);
    foreach($cats as $cat){
        $res = array_intersect($res, $cat);
    }
但出现以下错误:参数1不是数组

我检查了$cat[a]和$cat[b]的类型,它们是一个持久性集合

在调用array\u intersect之前,我还尝试调用$res=$res->toArray和$cat=$cat->toArray。这解决了错误,但没有返回预期结果:Icon1


有没有人有任何想法,或者可能有更好的方法来解决这些问题?

我最终使用了条令查询生成器。这很痛苦,但我终于明白了。以下是最终结果:

$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)));

我最终使用了条令查询生成器。这很痛苦,但我终于明白了。以下是最终结果:

$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)));

为什么不想使用DQL:。。。a、b中的icon.category在哪里?我在查询中尝试了以下方法:从SixStringPearBundle中选择I:icon I,其中I.categories在1、2'中,我得到以下错误:categories in':错误:无效的PathExpression。应为StateFieldPathExpression或SingleValuedAssociationField。1,2指的是类别idwhere IDENTITYi.categories IN。这会不会返回任何类别中的图标,而不是所有类别中的图标?哦,对不起,误读了问题。那么您的答案是正确的。为什么不使用DQL:。。。a、b中的icon.category在哪里?我在查询中尝试了以下方法:从SixStringPearBundle中选择I:icon I,其中I.categories在1、2'中,我得到以下错误:categories in':错误:无效的PathExpression。应为StateFieldPathExpression或SingleValuedAssociationField。1,2指的是类别idwhere IDENTITYi.categories IN。这会不会返回任何类别中的图标,而不是所有类别中的图标?哦,对不起,误读了问题。那么你的答案是正确的。最好对所有输入使用占位符参数。你说的是:$qb->还是其中的'c.name=\$术语。“\;?我不知道如何添加占位符,因为它位于foreach内部,并且有未知数量的术语可以在中使用:$qb->或where'c.name IN?1'->setParameter1,$terms;…->具有'counti.id=?2'。。。需要条令>=2.1。非常感谢!我更新了我的答案以反映占位符的正确使用。最好对所有输入使用占位符参数。你说的是:$qb->还是'c.name=\$术语。“\;?我不知道如何添加占位符,因为它位于foreach内部,并且有未知数量的术语可以在中使用:$qb->或where'c.name IN?1'->setParameter1,$terms;…->具有'counti.id=?2'。。。需要条令>=2.1。非常感谢!我更新了答案,以反映占位符的正确使用