按标签查找所有文章,多对多关系

时间:2017-08-10 09:30:41

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

问题

我在 Doctrine 中有一个Article实体,它与Tag有多对多的关系。也就是说,Article可以用多个标签“标记”,并且它们由数据库中的 articles_tags 表绑定在一起。

让我们假设我们想要找到与给定Article相关联的所有Tag。举个例子,让我们说我们想找到与“cars”标签相关的所有Article:一篇关于汽车的文章。

DQL SQL

相反

如果这是常规SQL(或其某种风格),我会以与以下类似的方式编写查询:

SELECT * FROM articles_tags WHERE tag_id IN (
    SELECT id FROM tags WHERE name = 'cars')

这将为我们提供所有 article_tags ,其中有Tag,其名称为“cars”。当然,如果一次在查询中使用多个标签,也应该抛弃重复的文章:可能使用GROUP BY。此外,您甚至可以通过编写更长的查询来摆脱首先选择 article_tags 然后转到Article的中间步骤。

根据我目前对 Doctrine 的理解,其范围不超过几天,您无法直接引用中间表;也不会像使用DQL编写子查询一样。因此,我不知所措。

关于我应该从哪里开始编写查询的任何指针,或者关于如何在ORM中处理这些类型的数据库检索的任何信息,例如 Doctrine 将非常有帮助!

1 个答案:

答案 0 :(得分:1)

DQL中的查询比纯SQL更简单:

$q = "
SELECT a FROM AppBundle:Article
LEFT JOIN a.tags t
WHERE t.name = :tag";

$result = $em->createQuery($q)
        ->setParameter('tag', $tag)
        ->getResult()
;