我有两个实体:
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)
有人对这一切有什么想法或者更好的方法吗?
我最终使用了学说查询生成器。这很痛苦,但我终于弄清楚了。最终结果如下:
$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)));