2012-04-14 10 views
5

私は2つのクラスUserRoleを持っています。ROLE_PROVIDERロールを持つユーザのクエリを返すQueryBuilderを作成する必要があります。symfony 2のDoctrine 2 - アソシエーションによるQueryBuilderのフィルタリング

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

そして、私のカスタムUserRepositoryに私は返す必要があり、以下の機能を持っている:私は、私が言及したフィールドに次のコードを持つフォームクラス定義でのSymfony 2のエンティティフォームフィールドのためにこれを必要とします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はネイティブで関連付けによるフィルタリングをサポートしていないようです。 this pageでは、こういったことがあり、この種のフィルタリングにはDQLを使用することを推奨します。私の問題は、文からQueryBuilderオブジェクトを作成する方法が見つからないということです。 DQLクエリを私にも提供できる場合、私は非常に感謝しています。

ありがとうございました!

答えて

11

あなたが実際にやるべきことはどこですか。あなたは単に「で」の間違った構文を持つ:

この

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

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

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

私は関連付けによってフィルタリングする必要があるため、あなたは良い質問をします。私はD2.2がこれをそのまま受け入れてくれるだろうと思う。私は実際にそれを試していないが、私は

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

が実際の$ DQLのあなたの休暇限り実際の「選択」の文字列を任意の他の部分を指定せずに動作すると思われます。テストされていない。

+0

...はるかに読みやすい$ QB-> exprの()を追加するよりもこれを見つけるありがとう!本当に完全な答え... 1つの質問、それは元の質問とはあまり関係していませんが、ここに行きます...私はsymfony 2とdoctrine 2の新しいバージョンが来ていることを何度か読んでいます。新しい機能はありますが、 'php bin/vendors install'を実行するのがうんざりです。symfonyも教義もアップグレードしていません...どうすればアップグレードできますか?またはそれらの新しいバージョンは公式になるだろうか?ご回答有難うございます!!! – Throoze

+0

D2.2については、http://www.doctrine-project.org/をご覧ください。 S2はS2.2がリリースされるまでD2.2が統合されることはありません。ただし、D2.2を直接インストールして、autoload.phpでパスを調整することができます。ほとんどの場合、あなたの教義コードは機能するはずです。注意すべき点については、ドキュメントをチェックしてください。 – Cerad

+0

あなたの答えをありがとう! – Throoze

3

まだあなたが行うことができますさらに簡単:

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

私は

関連する問題