如何在Doctrine 2 DQL中使用DATE()?

13

在Symfony中,当我在MySQL中使用带有DATE函数的以下查询时,会出现错误。

    SELECT employer.companyName AS employerName, jobs.jobId, jobs.industryId, 
jobs.focusId, jobs.companyName, jobs.employerId, jobs.jobTitle, DATE(jobs.createdDate) AS 
createdDate , DATE(jobs.endDate) AS endDate , jobs.replyTo, jobs.featured , jobs.jobType, 
jobs.status  FROM Acme\\AppsBundle\\Entity\\Jobs jobs , Acme\\AppsBundle\\Entity\\Employer 
employer  WHERE  jobs.employerId = employer.employerId  GROUP BY  jobs.jobId  ORDER BY 
jobs.jobId DESC 

为什么会出现这种情况,有什么解决方法可以克服这种情况,在数据库中,这些字段即 end_date 存储为 mysql 类型“date”

    [2014-09-17 05:52:42] request.CRITICAL: Uncaught PHP Exception Doctrine\ORM\Query
\QueryException: "[Syntax Error] line 0, col 138: Error: Expected known function, got 
'DATE'" at /.../Doctrine/ORM/Query/QueryException.php line 52 {"exception":"[object] 
(Doctrine\\ORM\\Query\\QueryException: [Syntax Error] line 0, col 138: Error: Expected known function, got 'DATE' at /var/w.../doctrine/orm/lib/Doctrine/ORM/Query
/QueryException.php:52, Doctrine\\ORM\\Query\\QueryException: SELECT employer.companyName 
AS employerName, jobs.jobId, jobs.industryId, jobs.focusId, jobs.companyName, jobs.employerId, jobs.jobTitle, DATE(jobs.createdDate) AS createdDate , DATE(jobs.endDate) 
AS endDate , jobs.replyTo, jobs.featured , jobs.jobType, jobs.status  FROM Acme\\AppsBundle
\\Entity\\Jobs jobs , Acme\\AppsBundle\\Entity\\Employer employer  WHERE  jobs.employerId 
= employer.employerId  GROUP BY  jobs.jobId  ORDER BY  jobs.jobId DESC  at /var/w...
/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:41)"} []
3个回答

24
除了接受的答案外,还有大量预先构建的自定义函数可在https://github.com/beberlei/DoctrineExtensions上找到。
然后可以将它们注册到您的配置中。
doctrine:
    orm:
        dql:
            string_functions:
                DATE: DoctrineExtensions\Query\Mysql\Date

然后可以在您的 DQL(查询语句)中使用,例如:

DATE(jobs.endDate) AS endDate

1
如果这个方法对任何人都不起作用(如果它抛出一个未识别的DQL错误),当我在层次结构中将entity_managers: default:放在DQL之前时,它就可以工作了。 - Michael Millar
这取决于您的配置。doctrine.orm.dqldoctrine.orm.entity_managers.default.dql 的简写。您之前的配置中是否提到了 entity_managers? - qooplmao
是的,entity_managers 已经在我的 config.yml 中位于 orm 之下,所以我认为这就是为什么 doctrine.orm.dql 不起作用但 doctrine.orm.dql 起作用的原因。好知道。 - Michael Millar

12

或者,如果您不想添加新的依赖项,可以使用以下代码:

$dateTime = new \DateTime();
$qb
   ->andWhere('jobs.endDate BETWEEN :dateMin AND :dateMax')
   ->setParameters(
       [
            'dateMin' => $dateTime->format('Y-m-d 00:00:00'),
            'dateMax' => $dateTime->format('Y-m-d 23:59:59'),
       ]
    );

8

DQL 只能识别少量标准的sql函数(例如 coalesce)。如果要使用自定义函数,您需要在doctrine中注册并告诉它如何将其转换为原始sql。请参考以下指南:

Symfony 文档

Doctrine 文档

并查看我的回答这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接