自定义原则2 'datetime'类型也用于'date'比较?



我在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()的第三个参数来强制绑定类型,并通过您的方式强制参数转换。

最新更新