Doctrine2 如何比较两个结果集

问题描述 投票:0回答:1

我有两个实体:

Category
Icon
它们具有多对多关系,所以我最终得到三个表:
category
icon
icon_category

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

例如我有以下

类别:

a
b
c
和图标
1
2
3

以下是图标的类别:

1
-
a
b

2
-
a

3
-
c

我想搜索类别

a
b
中的图标并获得
1
作为结果。

我的第一个方法是将每个类别(

a
b
)加载到单独的结果中,然后使用
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]
的类型,它们是 Doctrine Persistence Collection

我还尝试在调用

$res = $res->toArray()
之前调用
$cat = $cat->toArray()
array_intersect
这解决了错误,但没有返回预期结果:
Icon(1)

有人对这一切有什么想法或者更好的方法吗?

php doctrine-orm intersection
1个回答
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)));
© www.soinside.com 2019 - 2024. All rights reserved.