按日期筛选,忽略Symfony 5中DateTime对象中的时间



我正在尝试使用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对象分离为DateTime

最新更新