【问题标题】:Search in many-to-many relationship with Doctrine2使用 Doctrine2 在多对多关系中搜索
【发布时间】:2011-09-23 09:48:04
【问题描述】:

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

我有一个简单的 Article 和 ArticleTag 实体,它们具有多对多的关系。如何获取带有某个(或多个)标签的所有文章?

我的以下尝试:

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

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

...没用。谢谢!

【问题讨论】:

  • 多对多关系是单向的还是双向的?
  • @Problematic:我使用了单向映射。哪个更适合我的场景?
  • 如果你使用双向映射,你可以在你的标签中添加一个getArticles()方法,并使用标签获取文章的集合。
  • @Problematic:我也考虑过这一点,但这对于我的场景(不同类型的可能过滤器)来说不是很灵活。我已经发布了我的最终解决方案作为答案。

标签: php many-to-many doctrine-orm symfony


【解决方案1】:

获胜者是...... 请鼓掌 ...

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

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

【讨论】:

  • 1个标签是可以的,但是怎么才能把所有的文章都拿到几个标签呢?
  • @faost,我认为您只需要添加更多 where 子句和更多参数。 ...->andWhere(':tag1 MEMBER OF a.tags')->setParameter('tag1', $tag1)->andWhere(':tag2 MEMBER OF a.tags')->setParameter('tag2', $tag2)->...;。也可以使用setParameters方法一次性设置所有参数。
  • 谢谢!只是要发布这个问题,但这很有效
  • 在 Doctrine 2.5+ 中也可以作为 $qb->expr()->isMemberOf(':tag', 'a.tags') 使用。 (github.com/doctrine/doctrine2/blob/…)。目前似乎没有记录。
【解决方案2】:

我认为您可以修改此示例(来自文档):

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

【讨论】:

  • 我无法在我的应用程序中使用它。不管怎么说,还是要谢谢你!我已经发布了我的最终解决方案作为答案。
  • 我建议改用 QueryBuilder
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2015-10-29
  • 2019-05-10
  • 2012-08-09
相关资源
最近更新 更多