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

Posted

技术标签:

【中文标题】按标签、多对多关系查找所有文章【英文标题】:Find All Articles by Tag, Many-To-Many Relationship 【发布时间】:2017-08-10 09:30:40 【问题描述】:

问题

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

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

DQLSQL 相对

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

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

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

以我目前对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()
;

【讨论】:

以上是关于按标签、多对多关系查找所有文章的主要内容,如果未能解决你的问题,请参考以下文章

Laravel5.1 模型 --多对多关系

在 CloudKit 中处理多对多关系

Django:在多对多关系中查找所有值,其中相关集合的所有元素都符合特定条件

Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?

如何避免与 Doctrine2 和 Zend Framework 2 的多对多关系重复?

针对标签上的多对多连接优化 MySQL 查询