2011-09-23 4 views
12

これはおそらく簡単なものですが、私はそれを理解することも、答えを見つけることもできません。Doctrine2と多対多の関係で検索

私は単純なArticleとArticleTag Entitiesに多対多の関係を持っています。特定のタグ(またはタグ)を持つすべての記事を取得するにはどうすればよいですか?

私の次の試み:

$qb = $repository->createQueryBuilder('a') 
    // ... 
    ->andWhere('a.tags = :tag') 
    ->setParameter('tag', 'mytag') 
    // ... 

または

->andWhere(':tag in a.tags') 
    ->setParameter('tag', 'mytag') 

が...動作しませんでした。ありがとう!

+0

多対多リレーションシップは一方向か双方向ですか? – Problematic

+0

@問題:単方向マッピングを使用しました。私のシナリオではどちらが良いでしょうか? – Czechnology

+1

双方向マッピングを使用している場合は、タグに 'getArticles()'メソッドを追加し、タグを使用して記事のコレクションを取得できます。 – Problematic

答えて

39

そして勝者持って誰にでもある... ドラムロール、お願い ...

$qb = $repository->createQueryBuilder('a') 
    // ... 
    ->andWhere(':tag MEMBER OF a.tags'); 
    ->setParameter('tag', $tag); 
    // ... 

感謝私の質問を読んで考えてみましょう!

+0

1つのタグの作業ですが、どのようにすべての記事をいくつかのタグで取得できますか? –

+1

@faost、私はあなたが*どこに*節とより多くのパラメータを追加する必要があると思います。 ( 'タグ2メンバーa.tags') - > setParameter( 'tag2' - > 'tag2' 、$ tag2) - > ...; '。 'setParameters'メソッドを使って、すべてのパラメータを一度に設定することもできます。 – Czechnology

+1

ありがとう!この質問を正確に投稿するつもりでしたが、これは完全に機能しました – Matt

1

私はあなたが(ドキュメントから)この例をadаptことができると思います。

$query = $em->createQuery('SELECT u.id FROM CmsUser u WHERE EXISTS (SELECT p.phonenumber FROM CmsPhonenumber p WHERE p.user = u.id)'); 
+0

私のアプリケーションで動作させることができませんでした。とにかくありがとう!私は最終的な解決策を答えとして掲示しました。 – Czechnology

+0

代わりにQueryBuilderを使用することをお勧めします – user2019515