我在Symfony 2.0环境中使用条令2.1.7。为了正确处理日期和时间,我使用自定义的"日期时间"类型将每个日期和时间保存在数据库中的UTC中。当我加载它们时,所有内容都会转换为当前时区。这非常有效,配置如下(在我的Symfony项目的config.yml
中):
doctrine:
dbal:
default_connection: default
types:
datetime: AcmeDemoBundleGeneralUTCDateTimeType
我有一个名为Usage
的实体,它具有日期属性,具有日期类型。不知怎的,我没有检索到特定日期的任何使用信息,比如2013-02-18。我最终打开MySQL查询日志,发现执行了以下查询:
...
FROM account a0_
LEFT JOIN resource_usage r1_
ON a0_.id = r1_.account_id AND (r1_.date = '2013-02-17 23:00:00')
WHERE...
有趣的是,我认为有两件事出了问题。似乎发生了自定义datetime
类型转换(我在GMT+1),并且Doctrine2使用了错误的日期格式字符串。当应用自定义日期时间类型时,Doctrine2是否以某种方式覆盖了常规日期类型?还是我做错了什么?
(我在DQL中使用WITH
结构,但当我在WHERE
中使用相同的比较时,也会发生这种情况。)
Doctrine 2 ORM会自动将自定义类型所需的转换应用于绑定到它的参数。
在您的情况下,任何与datetime
应用的比较都会将AcmeDemoBundleGeneralUTCDateTimeType#convertToDatabaseValue($value, $platform)
的结果绑定到您的查询。
如果您只想用自定义datetime
格式处理一个特定的情况,您可能应该给它另一个名称,例如'utcdatetime'
,然后只在严格必要的情况下使用它。这样,与常规datetime
字段进行比较仍将保留原始行为。
您还可以通过使用DoctrineORMAbstractQuery#setParameter()
的第三个参数来强制绑定类型,并通过您的方式强制参数转换。