我在 Doctrine 中有一个Article
实体,它与Tag
有多对多的关系。也就是说,Article
可以用多个标签“标记”,并且它们由数据库中的 articles_tags 表绑定在一起。
让我们假设我们想要找到与给定Article
相关联的所有Tag
。举个例子,让我们说我们想找到与“cars”标签相关的所有Article
:一篇关于汽车的文章。
如果这是常规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 将非常有帮助!
答案 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()
;