symfony-select object where date=今天

ix0qys7i  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(338)

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

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

仅包含一个成员的实体(禁用日期)

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

当我试图检查今天的日期是否在数据库中时,上面的代码返回null。数据库中的日期已存在。搞什么鬼?

thigvfpy

thigvfpy1#

我用午夜修正器解决了这个问题。
当您在一个日期字段中声明时,在数据库中它将存储为日期时间,但实体使用日期时间接口。
因此,如果您尝试将一个新的\datetime(当前日期和时间)与存储在数据库中的日期(按条令解析为存储的日期+当前时间)进行比较,则比较结果永远不会相等。
使用午夜修正你真的是比较平等。

$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

pftdvrlh

pftdvrlh2#

因为 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" } 你想把准确的日期和时间(包括 seconds 以及 ms ). 这就是为什么结果是 null 不带日期的检查日期 h:i:s

相关问题