2011-09-23 108 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