我有一个查询,它为我提供了一个 unix 时间戳,该时间戳计算为选择表字段的日期时间值,然后添加表的另一个值。查询如下所示:
SELECT UNIX_TIMESTAMP(DATE_ADD(mydatetimefield, INTERVAL m.myfield1 + m.myfield2 MINUTE)) FROM mytable AS m
此查询从phpMyAdmin正确执行,但是当我尝试将其与Doctrine 2的createQueryBuilder方法一起使用时,我在"myfield"处出现错误。似乎它不支持 INTERVAL 关键字后的计算值
Error: Expected DoctrineORMQueryLexer::T_COMMA, got 'm'
然后,如何使用原则获得相同的查询结果?我使用查询生成器,因为我有一些命名参数
Doctrine不支持特定供应商的所有功能,例如DATE_ADD
。 但是,您可以使用自定义函数。 该链接有一个专门用于日期添加的示例。
原则 2:用户定义函数中扩展 DQL
根据查询的复杂性,另一个选项只是在应用程序代码中处理此问题。 如果你的mydatetimefield
实际上是一个日期时间,Doctrine 会在返回的对象中将其转换为 php DateTime
。
$myDateTimeField = $object->getMyDateTimeField();
$myDateTimeField->add(new DateInterval( $object->getMyField1() + $object->getMyField2() . 'M'));
最后,您也可以始终使用dbal
。
不确定这是否是原因,但由于它抱怨您有m
别名的逗号丢失,我怀疑它无法正确解析用户定义的函数。
是否已将DATE_ADD
和UNIX_TIMESTAMP
定义为 DQL 用户定义函数?有关更多详细信息,请参阅日期添加示例。