加入并计入DQL

Que*_*tin 6 mysql doctrine dql symfony doctrine-orm

我有一个MySQL命令,我找不到DQL中的等价物.我正在尝试获取列表中评论最多的帖子.这是MySQL命令:

SELECT posts.id, COUNT(comments.id) AS num
FROM posts
LEFT JOIN comments ON ( posts.id = comments.post_id )
GROUP BY posts.id
Run Code Online (Sandbox Code Playgroud)

结果如下:

id  num
1   8
2   9
3   17
4   7
5   6
6   20
7   7
8   10
9   14
10  7
Run Code Online (Sandbox Code Playgroud)

在DQL中,它应该是:

SELECT post, COUNT(comment.id) AS num
FROM Entity\Post post
LEFT JOIN post.comments comment
GROUP BY post.id
Run Code Online (Sandbox Code Playgroud)

但这给了:

id  num
1   50
2   0
3   0
4   0
5   0
6   0
7   0
8   0
9   0
10  0
Run Code Online (Sandbox Code Playgroud)

我不明白50来自哪里以及为什么两个结果之间存在差异.你能告诉我如何让这个加入在Doctrine中工作吗?

Cro*_*zin 8

我做了一些测试,发现一切似乎都很好.

Video: id, title, ...
Comment: id, video_id, content, ...
Run Code Online (Sandbox Code Playgroud)

数据库模式非常简单,我认为不需要任何解释.

#DQL:
    SELECT v.id, COUNT(c.id) AS num
    FROM Video v
    JOIN v.comments c
    GROUP BY v.id
    ORDER BY num DESC

#Generated SQL:
    SELECT v0_.id AS id0, COUNT(v1_.id) AS sclr1 
    FROM video v0_ 
    INNER JOIN video_comment v1_ ON v0_.id = v1_.video_id 
    GROUP BY v0_.id 
    ORDER BY sclr1 DESC

#Result set:
    Array
    (
        [0] => Array
            (
                [id] => 148
                [num] => 3
            )

        [1] => Array
            (
                [id] => 96
                [num] => 2
            )

        [2] => Array
            (
                [id] => 111
                [num] => 1
            )

        [3] => Array
            (
                [id] => 139
                [num] => 1
            )

    )
Run Code Online (Sandbox Code Playgroud)

如果选择整个Video对象而不是其id(v而不是v.idin SELECT子句),则查询也将执行.当然,不是id元素,Video 0 元素下会有一个对象.

在Doctrine 2.1.0-DEV上测试过