Doctrine2中的多对多关系搜索

15

这可能是一个简单的问题,但我无法解决,也找不到答案。

我有一些简单的文章(Article)和文章标签(ArticleTag)实体,它们之间是多对多的关系。如何获取所有具有特定标签(或标签)的文章?

以下是我的尝试:

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

...没起作用。谢谢!


多对多关系是单向的还是双向的? - Problematic
@Problematic:我已经使用了单向映射。对于我的情况来说哪种更好? - Czechnology
1
如果您使用双向映射,可以在标签中添加一个 getArticles() 方法,并使用该标签获取文章集合。 - Problematic
@Problematic:我也考虑过这个问题,但对于我的情况来说并不是很灵活(可能有不同类型的过滤器)。我已经将我的最终解决方案发布为答案。 - Czechnology
2个回答

53

胜利者是... 请敲鼓声...

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

感谢所有抽出时间来阅读和思考我的问题的人!


它可以为一个标签工作,但如何通过几个标签获取所有文章? - alexfv
1
@faost,我想您只需要添加更多的where子句和更多参数。 ...-> andWhere(':tag1 MEMBER OF a.tags')-> setParameter('tag1',$tag1)-> andWhere(':tag2 MEMBER OF a.tags')-> setParameter('tag2',$tag2)-> ...;。您还可以使用setParameters方法一次性设置所有参数。 - Czechnology
3
谢谢!我正准备发布这个问题,但这个答案完美解决了我的问题。 - Matt
4
从 Doctrine 2.5+ 开始,也可使用 $qb->expr()->isMemberOf(':tag', 'a.tags')。该功能目前似乎未被记录文档中。请参考链接:https://github.com/doctrine/doctrine2/blob/900b55d16afdcdeb5100d435a7166d3a425b9873/lib/Doctrine/ORM/Query/Expr.php。 - contrebis

1

我认为你可以适应这个例子(来自文档):

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

我无法在我的应用程序中使其工作。不管怎样,谢谢!我已经将最终解决方案发布为答案。 - Czechnology
我建议使用 QueryBuilder。 - user2019515

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接