2011-09-23 96 views
12

這可能很簡單,但我無法弄清楚,也找不到答案。在與Doctrine2的多對多關係中搜索

我有一個簡單的Article和ArticleTag實體與多對多的關係。我如何獲得具有特定標籤(或標籤)的所有文章?

我嘗試如下:

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

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

...沒有工作。謝謝!

+0

是單向還是雙向的多對多關係? – Problematic

+0

@Problematic:我使用了單向映射。哪個對我的場景更好? – Czechnology

+1

如果您使用雙向映射,則可以將'getArticles()'方法添加到您的標記中,並使用該標記獲取文章的集合。 – Problematic

回答

39

與獲獎者是...... 擊鼓聲,請 ...

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

謝謝大家誰都有花時間閱讀並思考我的問題!

+0

這是一個標籤的工作,但你怎麼能通過幾個標籤獲得所有文章? –

+1

@faost,我想你只需要添加更多的* where子句和更多的參數。 '...-> andWhere(':tag1 MEMBER OF a.tags') - > setParameter('tag1',$ tag1) - > andWhere(':tag2 MEMBER OF a.tags') - > setParameter('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