🎻

[Symfony] DoctrineでWHERE句にDateTimeを使うときはsetParameterの第三引数で型の指定が必要

2020/12/07に公開

はじめに

Symfony Advent Calendar 2020 の7日目の記事です!🎄🌙 小ネタですみません!

昨日も僕の記事で、[Symfony/Form] 子FormTypeの特定の項目をそのユースケースでのみ必須にする方法 でした✨

ちなみに、僕はよく TwitterにもSymfonyネタを呟いている ので、よろしければぜひ フォローしてやってください🕊🤲

本題

Doctrineで

$qb = $repository->createQueryBuilder('foo')
    ->andWhere('foo.createdAt >= :datetime')
    ->setParameter('datetime', new \DateTime('2020-1-1 0:0:0'))
;

みたいに WHERE 句で DateTime オブジェクトの大小関係を比較すると正常な結果が得られない(場合がある)ということに気付きました。

https://twitter.com/ttskch/status/1311671850334736384

Twitter上で悩んでいたら @doudemoiidesuyo さんが助言をくださり、 setParameter() の第三引数で型の指定が必要ということを知りました。

+ use Doctrine\DBAL\Types\Types;

  $qb = $repository->createQueryBuilder('foo')
      ->andWhere('foo.createdAt >= :datetime')
-     ->setParameter('datetime', new \DateTime('2020-1-1 0:0:0'))
+     ->setParameter('datetime', new \DateTime('2020-1-1 0:0:0'), Types::DATE_MUTABLE)
  ;

こうすれば正常に動作します。

ちなみに僕の環境だとMySQLを使っているdev/prod環境では問題は発生せず、sqliteを使っているtest環境でのみ問題が発生しました。

https://twitter.com/ttskch/status/1311672825208467456

が、その理由までは理解しておりません😅

どなたか詳しい方いらっしゃったらぜひ教えてください🙏

おわりに

というわけで、どこかの誰かの助けになれば幸いです😇

Symfony Advent Calendar 2020、明日は @77web さんです!お楽しみに!

GitHubで編集を提案

Discussion