将SQL转换为DQL

时间:2017-08-07 10:13:06

标签: sql symfony doctrine dql doctrine-query

我需要将此sql查询更改为doctrine查询或dql表单。这可能吗?

SELECT count(*) AS listenCount, l.post_id AS postId 
FROM (SELECT DISTINCT ll.user_id, ll.post_id FROM listen ll) l  
WHERE l.post_id IN (' . $id . ') 
GROUP BY  l.post_id

我的问题在于" FROM"前面的括号内的文字,它必须是dql中的类名。但由于DISTINCT命令,我不能给它一个类名。

1 个答案:

答案 0 :(得分:0)

您的查询的等效SQL可以重写为

SELECT COUNT(DISTINCT u.id) AS listenCount, 
p.id AS postId 
FROM YourBundle:listen l
JOIN l.user u 
JOIN l.post  p
WHERE p.id IN (' . $id . ') 
GROUP BY  p.id

在学说中,我假设您已经设置了包含用户实体和帖子实体映射的侦听实体,因此您可以为上述查询编写等效DQL,如下所示

SELECT p,COUNT(DISTINCT u.id) AS listenCount, 
FROM YourBundle:post p
JOIN p.listen  l
JOIN l.user u 
WHERE p.id IN (' . $id . ') 
GROUP BY  p.id
  

注意SQL查询只是获取结果而不使用用户和帖子表的连接,但在DQL中,您将需要两个实体的连接部分

更好的方法是选择帖子实体,然后做加入部分,还要注意我假设你的帖子实体有一个名为listen的监听实体的映射

CREATE TABLE IF NOT EXISTS users (id INT(11) NOT NULL AUTO_INCREMENT
                                  ,username VARCHAR(16) NOT NULL
                                  ,email VARCHAR(64) NOT NULL,password VARCHAR(64) NOT NULL
                                  ,gender ENUM('m','f') NOT NULL
                                  ,website VARCHAR(64) NULL
                                  ,country VARCHAR(64) NULL
                                  ,userlevel ENUM('a','b','c','d') NOT NULL DEFAULT 'a'
                                  ,avatar VARCHAR(64) NULL
                                  ,ip VARCHAR(64) NOT NULL
                                  ,signup DATETIME NOT NULL
                                  ,lastlogin DATETIME NOT NULL
                                  ,notescheck DATETIME NOT NULL,activated ENUM('0','1') NOT NULL DEFAULT 0
                                  ,PRIMARY KEY (id)
                                  ,UNIQUE KEY username (username,email))