1

私は2つのエンティティを持っています:CategoryそしてIconそれらは多対多の関係を持っているので、私は3つのテーブルになります: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]andのタイプを確認しました$cat[b]が、それらは Doctrine Persistence Collection です

$res = $res->toArray()私も呼び出しを試みましたが、呼び出す$cat = $cat->toArray()前にarray_intersectこれによりエラーは解決されましたが、期待される結果は返されませんでした:Icon(1)

誰かが何か考えを持っていますか、あるいはこれらすべてに対するより良いアプローチさえありますか?

4

1 に答える 1

1

最終的にDoctrineクエリビルダーを使用しました。悩みましたが、やっとわかりました。最終結果は次のとおりです。

$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)));
于 2013-07-19T22:58:24.523 に答える