5

と の 2 つのクラスがUserあり、ロールを持つユーザーのクエリを返すRoleを作成する必要があります。Symfony 2 のエンティティ フォーム フィールドにこれが必要です。フォーム クラスの定義には、前述のフィールドの次のスニペットがあります。QueryBuilderROLE_PROVIDER

$builder->add('provider', 'entity', array(
    'class'    => 'ElCuadreAccountBundle:User',
    'property' => 'username',
    'query_builder' => function(UserRepository $ur) {
                         return $ur->getUsersByRoleQB('ROLE_PROVIDER');
                       },
    'required' => true,
));

そして、私のカスタムには、オブジェクトUserRepositoryを返す次の関数があります。QueryBuilder

public function getUsersByRoleQB($role) {
    $qb = $this->createQueryBuilder('u');
    return $qb->join('u.roles','r')
              ->where($qb->expr()->in('r.role',$qb->expr()->literal($role)))
              ->orderBy('u.username', 'ASC');
}

もちろん、これは機能しませんが、私のニーズを説明するために貼り付けました。

私は周りを見回してきましたが、Doctrine2 は関連によるフィルタリングをネイティブにサポートしていないようです。このページDQLでは、彼らはそう言っており、この種のフィルタリングに使用することを提案しています. 私の問題は、文QueryBuilderからオブジェクトを作成する方法が見つからないことです。DQL適切なクエリも提供してDQLいただければ、非常に感謝しています...

ご協力いただきありがとうございます!

4

2 に答える 2

11

あなたが望むことを実際にどこで行うべきか。「in」の構文が間違っているだけです:

これ

->where($qb->expr()->in('r.role',$qb->expr()->literal($role)))

する必要があります

->where($qb->expr()->in('r.role',$role))

少し奇妙に思えるかもしれませんが、準備されたステートメントは配列を直接サポートしていないため、 IN 句へのパラメーターは常に個別にエスケープする必要があります (教義はあなたのために行います)。したがって、リテラルが必要な eq 式の構文は少し異なります。

関連性でフィルタリングする必要があったので、あなたは良い質問をします。D2.2 では、これをそのまま使用できるようになると思います。私は実際にそれを試したことはありませんが、私はそれを疑っています

$dql = 'a,b FROM whatever...'; // Don't start with SELECT
$qb->select($dql); 
return $qb;

実際の 'SELECT' 文字列を $dql から除外する限り、他の部分を指定しなくても実際に機能します。未テスト。

于 2012-04-14T17:15:29.650 に答える
3

さらに簡単にできること:

->where('r.role IN (:role)' )
->setParameter( 'role', $role );

これは、$ qb-> expr()を追加するよりもはるかに読みやすいと思います...

于 2012-12-11T19:46:44.280 に答える