0

システム内の人を検索するために、リポジトリに関数を記述しました。この関数は、フィールド名と条件を含む配列を受け取り、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)のような配列として提供されます。

特定のドメインに属する人を見つけることができるようにするには、何を変更できますか?

4

1 に答える 1

0

試行錯誤の結果、2 つの答えが見つかりました。

1)どうやらクエリビルダーでは、結合テーブルに存在し、実際にはエンティティの一部ではないフィールドを参照できます。したがって、1つの解決策は次のとおりです。

#filter on domain(s)
    if (key($condition)=='domains')
        $query = $query->andWhere('p.domain_id IN ('.$condition['domains'].')');

... domain_id は、内部で Symfony2 によって作成された結合テーブル「person_domain」に存在します。

2)内部結合は不要になりました。内部結合を使用することも可能ですが、それは間違った方法で書かれており、とにかく機能しませんでした。次のように書かれているはずです。

->leftjoin('p:domain', 'd', 'ON p.id = d.id')

他の人が上記の恩恵を受けることを願っています。

于 2012-12-05T09:44:19.293 に答える