システム内の人を検索するために、リポジトリに関数を記述しました。この関数は、フィールド名と条件を含む配列を受け取り、querybuilderを使用して有効なDQLステートメントを作成します。
次のような検索ルールを作成するまでは、すべて正常に機能します。
「特定のドメインに属するすべての人を検索します。」
...PersonエンティティとDomainエンティティが多対多の関係にある場合。
Symfony2によると、その関係は正しく定義されており、実際、すべてがTwigテンプレートとコントローラーで機能します。
関数は次のようになります。-
private function query($extra_conditions = null)
{
$qb = $this->_em->createQueryBuilder();
$query =
$qb->select('p')
->from('AppMainBundle:Person', 'p')
->leftjoin('AppMainBundle:Domain', 'd')
->where("p.firstname IS NOT NULL")
->andWhere("p.lastname IS NOT NULL")
->andWhere("p.function IS NOT NULL");
if ($extra_conditions!=null)
{
foreach ($extra_conditions as $condition)
{
#filter on firstname
if (key($condition)=='firstname')
$query = $query->andWhere('p.firstname LIKE ?1')
->setParameter(1, $condition['firstname']);
#filter on lastname
if (key($condition)=='lastname')
$query = $query->andWhere('p.lastname LIKE ?1')
->setParameter(1, $condition['lastname']);
#filter on gender
if (key($condition)=='gender')
$query = $query->andWhere('p.gender = '.$condition['gender']);
#filter on domain(s)
if (key($condition)=='domains')
$query = $query->andWhere('d.id IN ('.$condition['domains'].')');
#filter on town
if (key($condition)=='town')
$query = $query->andWhere('p.town LIKE ?1')
->setParameter(1, $condition['town']);
}
}
$query = $query->orderBy("p.lastname", "ASC");
$query = $qb->getQuery();
return $query->getResult();
}
エラーはありませんが、検索条件として指定されているドメインはすべてです。すべてのドメインの人が見つかり、返されます。
ドメインは(2、4)のような配列として提供されます。
特定のドメインに属する人を見つけることができるようにするには、何を変更できますか?