0

我在 Symfony 2.0 环境中使用 Doctrine 2.1.7。为了正确处理日期和时间,我使用自定义的“日期时间”类型将每个日期和时间以 UTC 格式保存在数据库中。当我加载它们时,所有内容都会转换为当前时区。这完美地工作并且配置如下(在我的 Symfony 项目中config.yml):

doctrine:
  dbal:
    default_connection: default
    types:
      datetime:  Acme\DemoBundle\General\UTCDateTimeType

我有一个Usage使用日期属性调用的实体,它具有日期类型。不知何故,我未能检索到特定日期的任何使用信息,比如 2013 年 2 月 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 是否会以某种方式覆盖常规日期类型?还是我做错了什么?

(我WITH在我的 DQL 中使用了该构造,但是当我在 . 中使用相同的比较时也会发生这种情况WHERE。)

4

1 回答 1

0

Doctrine 2 ORM 自动将自定义类型所需的转换应用于绑定到它的参数。

在您的情况下,应用的任何比较datetime都会将结果绑定Acme\DemoBundle\General\UTCDateTimeType#convertToDatabaseValue($value, $platform)到您的查询。

如果您只想使用自定义datetime格式处理一个特定情况,您可能应该给它另一个名称,例如'utcdatetime',然后仅在绝对必要时使用它。这样,与常规datetime字段的比较仍将保留原始行为。

您还可以通过使用第三个参数来强制绑定类型,并按照Doctrine\ORM\AbstractQuery#setParameter()您的方式强制进行参数转换。

于 2013-02-19T12:09:32.550 回答