按标签、多对多关系查找所有文章
Posted
技术标签:
【中文标题】按标签、多对多关系查找所有文章【英文标题】:Find All Articles by Tag, Many-To-Many Relationship 【发布时间】:2017-08-10 09:30:40 【问题描述】:问题
我在 Doctrine 中有一个 Article
实体,它与 Tag
具有多对多关系。也就是说,一个Article
可以被多个标签“标记”,它们通过数据库中的articles_tags表绑定在一起。
假设我们想要找到与给定Tag
关联的所有Article
s。举个例子,假设我们想找到所有与“汽车”标签相关的Article
s:一篇关于汽车的文章。
DQL 与 SQL 相对
如果这是常规 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
s 的中间步骤。
以我目前对Doctrine的理解,不超过几天,不能直接引用中间表;似乎您也不能使用 DQL 编写子查询。因此,我很茫然。
任何关于我应该从哪里开始编写查询的指针,或者任何关于一般如何在诸如 Doctrine 之类的 ORM 中处理这些类型的数据库检索的信息都会非常有帮助!
【问题讨论】:
【参考方案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()
;
【讨论】:
以上是关于按标签、多对多关系查找所有文章的主要内容,如果未能解决你的问题,请参考以下文章
Django:在多对多关系中查找所有值,其中相关集合的所有元素都符合特定条件
Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?