2012-07-11 46 views
2

我有两个实体:Article和Category。这有一个多对多的表: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 

回答

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(); 

我想我必须指定连接需要出现在那里(“... ON c.id = ac.category_id ......”)。然而,由于多对多已经被数组集合映射(在我的例子中是“articles”),我在我的“Category”实体中,我猜“ON”是隐含的。

+0

嘿,你确定你的查询没有生成交叉连接(carthesian产品)? – danielperaza 2013-09-05 06:29:56