1

他のオブジェクトと複数の多対多の関係を持つエンティティを持つアプリケーションを作成しています。エンティティをレイアウトします。

  • エントリー=メインオブジェクト
  • Region = 「_entry_region」参照テーブルを介した Entry による多対多
  • Type = 「_entry_type」参照テーブルを介した Entry による多対多
  • Tag = 「_entry_tag」参照テーブルを介した Entry による多対多

フロントエンドで、ユーザーはロードする必要があるエントリに対していくつかのフィルタを設定できます。人間の言葉では、クエリはこのようにする必要があります。

Get the entries WHERE  region is (1 or 2 or 3) AND type is ( 3 or 4 or 5 ) AND tag is ( 4 OR 6 or 1)

私は現在、このコードに苦労しています:

$query = $this->em->createQuery('SELECT m.id FROM Entity\Entry e WHERE :region_id MEMBER OF e.regions);
$query->setParameter('region_id',  1);      
$ids = $query->getResult();

これにより、対応する地域のエントリの ID が得られます。ただし、setParameter() でリージョン ID の配列を追加することはできません。また、ドキュメントには、人間ベースのクエリのような複数の関連エンティティでこれを行う方法が見つかりません。

Get the entries WHERE  region is (1 or 2 or 3) AND type is ( 3 or 4 or 5 ) AND tag is ( 
4

1 に答える 1

4

D2 クエリ ビルダーも検討してみてください。もう少し冗長ですが、構文を理解すれば、より複雑なクエリを作成する方がはるかに簡単です。

何かのようなもの:

    $qb = $this->em->createQueryBuilder();

    $qb->addSelect('entry');
    $qb->addSelect('region');
    $qb->addSelect('type');
    $qb->addSelect('tag');

    $qb->from('MyBundle:Entry',   'entry');
    $qb->leftJoin('entry.regions','region');
    $qb->leftJoin('entry.types',  'type');
    $qb->leftJoin('entry.tags',   'tag');


    $qb->andWhere($qb->expr()->in('region.id',$regions));
    $qb->andWhere($qb->expr()->in('type.id',  $types));
    $qb->andWhere($qb->expr()->in('tag.id',   $tags));
于 2012-06-01T14:02:25.823 に答える