🎻
[Symfony] DoctrineでWHERE句にDateTimeを使うときはsetParameterの第三引数で型の指定が必要
はじめに
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
オブジェクトの大小関係を比較すると正常な結果が得られない(場合がある)ということに気付きました。
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環境でのみ問題が発生しました。
が、その理由までは理解しておりません😅
どなたか詳しい方いらっしゃったらぜひ教えてください🙏
おわりに
というわけで、どこかの誰かの助けになれば幸いです😇
Symfony Advent Calendar 2020、明日は @77web さんです!お楽しみに!
Discussion