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中工作吗?
我做了一些测试,发现一切似乎都很好.
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上测试过
| 归档时间: |
|
| 查看次数: |
6755 次 |
| 最近记录: |