0

私はSymfony2.0環境でDoctrine2.1.7を使用しています。日付と時刻を正しく処理するために、カスタムの「datetime」タイプを使用して、すべての日付と時刻をUTCでデータベースに保存しています。それらをロードすると、すべてが現在のタイムゾーンに変換されます。これは完全に機能し、次のように構成されています(私のSymfonyプロジェクトではconfig.yml):

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...

これが面白い部分です。2つのことがうまくいかなかったと思います。カスタムdatetime型変換が発生したようで(私はGMT + 1にいます)、Doctrine2で間違った日付形式の文字列が使用されています。Doctrine2は、カスタム日時が適用されたときに、通常の日付タイプを何らかの形でオーバーライドしますか?それとも私は何か間違ったことをしていますか?

WITHDQLで構成を使用していますが、内部で同じ比較を使用している場合にも発生しWHEREます。)

4

1 に答える 1

0

Doctrine 2 ORM は、カスタム タイプに必要な変換を、それにバインドするパラメータにも自動的に適用します。

あなたの場合、適用された比較は、結果をクエリdatetimeにバインドします。Acme\DemoBundle\General\UTCDateTimeType#convertToDatabaseValue($value, $platform)

カスタムdatetime形式で特定の 1 つのケースのみを処理する場合は、別の名前を付けて、'utcdatetime'厳密に必要な場合にのみ使用する必要があります。そうすれば、通常datetimeのフィールドとの比較でも元の動作が保持されます。

の 3 番目のパラメーターを使用してバインディング タイプをDoctrine\ORM\AbstractQuery#setParameter()強制し、パラメーター変換を強制することもできます。

于 2013-02-19T12:09:32.550 に答える