问题
我在教义中有一个Article
实体,它与Tag
具有多对多关系。也就是说,一个Article
可以用多个标签"标记",它们通过数据库中的articles_tags表绑定在一起。
假设我们想找到与给定Tag
相关的所有Article
。举个例子,假设我们想找到与"cars"标签相关的所有Article
:一篇关于汽车的文章。
DQL与SQL相对
如果这是常规的SQL(或它的某种风格(,我会以类似于以下内容的方式编写查询:
SELECT * FROM articles_tags WHERE tag_id IN (
SELECT id FROM tags WHERE name = 'cars')
这将使我们所有人都article_tags有一个名为"汽车"的Tag
。当然,如果一次在查询中使用多个标签,也应该丢弃重复的文章:也许通过使用GROUP BY
。此外,您甚至可以通过编写更长的查询来摆脱首先选择article_tags然后转到Article
的中间步骤。
根据我目前对Doctrine(不超过几天(的理解,您不能直接引用中间表;您似乎也不能使用 DQL 编写子查询。因此,我不知所措。
任何关于我应该从哪里开始编写查询的指示,或者关于一般如何在 ORM 中处理这些类型的数据库检索的任何信息,例如Doctrine,都将非常有帮助!
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()
;