如何在doctrine匹配/加入id上查询多对多表

时间:2012-07-11 16:46:40

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

我有两个实体:文章和类别。这有多个表:article_category。

我可以在MySQL中没有问题地执行此查询:

SELECT COUNT(*) cnt, c.id, c.name FROM article_category ac, category c WHERE ac.category_id = c.id GROUP BY c.id ORDER BY cnt DESC

但我无法将其转换为Doctrine2查询。下面返回一个不存在的类错误,参考article_category表。

[...]
createQuery("SELECT COUNT(*) cnt, c.id, c.name FROM article_category ac, category c WHERE ac.category_id = c.id GROUP BY c.id ORDER BY cnt DESC")
[...]

要指明,我的问题是我不知道如何访问多对多表中的“category_id”。

修改

这是使用内部联接的相同查询(如果它更容易)。

SELECT COUNT(*) cnt, c.id, c.name FROM category c INNER JOIN article_category ac ON c.id = ac.category_id GROUP BY c.id ORDER BY cnt DESC

1 个答案:

答案 0 :(得分:4)

我能够弄清楚。我使用DQL创建查询:

    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->select('COUNT(c) cnt, c.id, c.name')
    ->from('NatknowEditorBundle:Category', 'c')
    ->innerJoin('c.articles', 'ac')
    ->groupBy('c.id')
    ->orderBy('cnt', 'DESC');

    return $qb->getQuery()->getResult();

我认为我必须指定JOIN需要发生的位置(“... ON c.id = ac.category_id ...”)。但是,由于多对多已经由数组集合(在我的情况下为“文章”)映射,我在“类别”实体中,我猜“ON”是隐含的。