Doctrine 在带有DQL的WHERE子句中使用DATE()函数

Doctrine 在带有DQL的WHERE子句中使用DATE()函数,doctrine,doctrine-orm,dql,Doctrine,Doctrine Orm,Dql,执行此DQL查询时,我遇到一个奇怪的错误: SELECT u FROM User u LEFT JOIN u.schedule s WHERE DATE(s.timestamp) = DATE(NOW()) 条令引发异常并显示以下消息: Expected known function, got 'DATE' 这个问题看起来与类似,但它解决了GROUPBY子句中的DATE()函数,并且针对Doctrine 2.2关闭了该错误。此时,我得到了条令2.4-DEV的例外 该查询旨在选择今天计划的所有

执行此DQL查询时,我遇到一个奇怪的错误:

SELECT u FROM User u LEFT JOIN u.schedule s WHERE DATE(s.timestamp) = DATE(NOW())
条令引发异常并显示以下消息:

Expected known function, got 'DATE'
这个问题看起来与类似,但它解决了GROUPBY子句中的DATE()函数,并且针对Doctrine 2.2关闭了该错误。此时,我得到了条令2.4-DEV的例外


该查询旨在选择今天计划的所有用户。有没有办法创建这个DQL?我在phpMyAdmin中测试了SQL版本,在那里查询没有引发错误。可能有什么问题?

您可以通过以下方法实现您想要的:

使用条令\ORM\Query\AST\Functions\FunctionNode;
使用条令\ORM\Query\Lexer;
使用条令\ORM\Query\SqlWalker;
使用条令\ORM\Query\Parser;
类DateFunction扩展FunctionNode
{
私人$arg;
公共函数getSql(SqlWalker$SqlWalker)
{
返回sprintf('DATE(%s)',$this->arg->dispatch($sqlWalker));
}
公共函数解析(解析器$Parser)
{
$parser->match(Lexer::T_标识符);
$parser->match(Lexer::T_OPEN_括号);
$this->arg=$parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_括号);
}
}
然后在代码中注册此函数:

$em->getConfiguration()->addCustomDatetimeFunction('DATE','DateFunction');

并且您的DQL查询将工作

Doctrine2 DQL没有DATE()或NOW()函数:。但是你真的想比较两个时间戳是否相等吗?我已经安排了患者预约(日期+时间),我想列出今天的所有患者。有一种难看的方法:为“今天”准备一个php
DateTime
对象。并将datetime字段拆分为“日期”和“时间”部分。我可以克服第一个难看的部分,但第二个只是在处理数据库,因为这是一个抽象层问题。所以,这就是为什么我希望有一个可行的解决方案:)我尝试了一个
选择CAST(s.timestamp as DATE)作为日程安排日,从。。。WHERE schedule_day=:today
但它返回了一个类似的错误…将尝试,谢谢!这可以帮我省去很多麻烦,因为我会将计划的时间戳拆分为一个单独的日期和时间部分。下面是如何在Symfony2应用程序中注册新的DQL函数:另外,别忘了在类中添加名称空间定义,否则symfony会抱怨文件中找不到类。有一个非常酷的composer软件包,它包含几乎所有MySQL函数:另请参阅:注册函数。当我尝试此操作时,my DATE()函数返回的是字符串而不是日期时间。。。是否缺少一个配置选项来告诉ORM。。。“此字符串应为日期时间”?