2013-02-19 62 views
0

我在Symfony 2.0環境中使用Doctrine 2.1.7。爲了正確處理日期和時間,我使用了一個自定義的「日期時間」類型來在數據庫中保存UTC中的每個日期和時間。當我加載它們時,一切都轉換爲當前時區。這完美的作品,並配置是這樣的(在我的Symfony項目的config.yml):自定義Doctrine2'datetime'類型還用於'日期'比較?

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

我有一個實體,稱爲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在應用自定義日期時間時以某種方式覆蓋常規日期類型?或者我做錯了什麼?

(我使用的是WITH結構在我的DQL,但是當我使用WHERE內相同的比較,也出現。)

+1

如果你有一個自定義的日期時間格式,你最終應該給它另一個名字,而不是覆蓋內置的一個。 – Ocramius 2013-02-19 10:53:17

+0

@Ocramius參見Doctrine文檔,其建議OP的原始情況的類似解決方案 - http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/cookbook/working-with-datetime.html – richsage 2016-06-16 09:51:05

回答

0

學說2 ORM自動應用也對您的自定義類型所需的轉換你綁定的參數。

對於您的情況,與datetime一起應用的任何比較都會將Acme\DemoBundle\General\UTCDateTimeType#convertToDatabaseValue($value, $platform)的結果綁定到您的查詢。

如果你想只處理了一個與您的自定義datetime格式的特定情況下,你應該給它一個名稱,如'utcdatetime',然後用它只有在絕對必要的。這樣,與常規datetime字段的比較仍將保留原始行爲。

您也可以使用第三個參數Doctrine\ORM\AbstractQuery#setParameter()強制綁定類型,並以您的方式強制執行參數轉換。

+0

但事實是,'Usage'實體中的'date'屬性是'date'類型。這與我的自定義'datetime'類型無關。 – hvtilborg 2013-02-19 12:21:56

+0

儘管如此,通過'setParameter'強制類型在最後工作。但我仍然相信我注意到的行爲應該被視爲一個錯誤。 – hvtilborg 2013-02-19 12:27:28

+0

啊,是的,這是因爲https://github.com/doctrine/doctrine2/blob/2.3.2/lib/Doctrine/ORM/Query/ParameterTypeInferer.php#L53-L55(類型是自動檢測)。無論如何,以另一種方式爲您的自定義類型命名,以避免將來出現問題。 – Ocramius 2013-02-19 12:29:10