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

Php 如何在Doctrine 2 DQL中使用DATE()?,php,mysql,symfony,doctrine-orm,doctrine,Php,Mysql,Symfony,Doctrine Orm,Doctrine,在Symfony中,当我在mysql中使用以下带有日期函数的查询时,我得到了一个错误 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 e

在Symfony中,当我在mysql中使用以下带有日期函数的查询时,我得到了一个错误

    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)"} []

DQL
只知道很少的标准sql函数(例如
coalesce
)。为了能够使用自定义函数,您需要注册它并告诉
doctor
如何将其转换为原始sql。请遵循以下指南:


检查我的答案

除了公认的答案外,还有一吨预构建的定制功能可供选择

然后可以在您的配置中注册它们,如

doctrine:
    orm:
        dql:
            string_functions:
                DATE: DoctrineExtensions\Query\Mysql\Date
然后可以在DQL中使用(就像在查询中一样),如


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

$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'),
       ]
    );

如果这对任何人都不起作用(如果它抛出dql未识别错误),当我将
实体管理器:默认值:
放在dql之前的层次结构中时,它会起作用。这取决于您的配置
doctor.orm.dql
doctor.orm.entity\u managers.default.dql
的缩写。您的配置文件中是否有其他地方提到的实体经理?是的,
entity\u managers
已经在我的
config.yml
中的
orm
下面,因此我假设这就是
doctor.orm.dql
不起作用,但
doctor.orm.dql
起作用的原因。很高兴知道。
$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'),
       ]
    );