Symfony - Select 对象,其中日期 = 今天

Symfony - Select object where date = today

我有一个包含代码的实体存储库

$qb = $this->createQueryBuilder('tdd');
$qb->select('tdd')
->where($qb->expr()->eq('tdd.disable_date', ':dat'))
->setParameter('dat', new \DateTime());
return $qb->getQuery()->getOneOrNullResult();

并且仅包含一个成员的实体 (disable_date)

/**
 * @ORM\Column(type="date", unique=true, nullable=false)
 * @ORM\Id()
 */
private $disable_date;

当我尝试检查今天的日期是否在数据库中时,上面的代码 returns NULL。 数据库中的日期存在。 什么鬼?

因为 new DateTime() 创建的对象与此类似: object(DateTime)#1 (3) { ["date"]=> string(26) "2018-04-12 07:24:34.697668" ["timezone_type"]=> int(3) ["timezone"]=> string(10) "US/Pacific" }

并且您试图将准确的日期与时间匹配(包括 secondsms)。这就是为什么结果是 null

检查没有h:i:s

的日期

我使用午夜修改器解决了这个问题。

当您在 doctrine 中声明一个 Date 字段时,在数据库中它将存储为日期时间,但 Entity 使用 DateTime 接口。

因此,如果您尝试将新的 \DateTime(当前日期和时间)与存储在数据库中的日期进行比较,按照原则解析为存储日期 + 当前时间,比较永远不会相等。

使用 midnight 修饰符,您实际上是在比较相等。

$dateInDatabase = '2020-04-22'; 

$parsedByDoctrine = new \DateTime($dateInDatabase); // 2020-04-22 00:00:00 
$now = new \DateTime(); // 2020-04-22 17:20:00 
$todayMidnight = new \DateTime('midnight'); // 2020-04-22 00:00:00 

$now === $parsedInDatabase // FALSE 
$todayMidnight === $parsedInDatabase // TRUE 

这可以应用于 createQueryBuilder 或 findBy 方法

php.net/manual/en/datetime.formats.relative.php