我正在尝试使用Symfony 5查询生成器筛选日期。但是DateTime
对象中有时间,查询生成器也在查询中使用时间。
在我的控制器中,我捕获通过表单提交的POST
变量,并将它们存储在一个数组中以传递到我的存储库中。
$criteria['date'] = DateTime::createFromFormat('d/m/Y', $request->get('date'));
在我的存储库中,我正在构建如下的查询。
$qb->andWhere('quotation.date = :date');
$qb->setParameter('date', $criteria['date']);
问题是数据库表列的数据类型为datetime
,因此在进行筛选时,由于创建的DateTime
对象的时间不正确,因此不会出现任何结果
有没有一种方法可以只使用PHP或数据库中的日期部分进行筛选?
最简单的方法是:放置一个"quot;在格式化之前。
$criteria['date'] = DateTime::createFromFormat('!d/m/Y', $request->get('date'));
这将时间设置为00:00。如果没有感叹号,则始终使用当前时间。
您可以通过在00:00:00和23:59:59之间进行筛选来替换严格比较=
。
但是,我建议使用beberlei/DoctrineExtensions。
Doctrine 2的一组扩展,增加了对MySQL、Oracle、PostgreSQL和SQLite中可用函数的支持。
其中一个函数是DATE
,它将日期时间转换为日期,以帮助将日期时间与日期进行比较。
你可以用composer 安装它
composer require beberlei/doctrineextensions
您只需要在doctrine.yaml文件中配置要在项目中实现的函数。
在您的情况下,您只需要DATE功能:
doctrine:
#...
orm:
#...
entity_managers:
default:
#...
dql:
datetime_functions:
DATE: DoctrineExtensionsQueryPostgresqlDate
现在您应该能够使用DATE
功能:
$qb->andWhere('DATE(quotation.date) = DATE(:date)');
$qb->setParameter('date', $criteria['date']);
最简单的方法是将DateTime
对象分离为Date
和Time