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"
}
并且您试图将准确的日期与时间匹配(包括 seconds
和 ms
)。这就是为什么结果是 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 方法
我有一个包含代码的实体存储库
$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"
}
并且您试图将准确的日期与时间匹配(包括 seconds
和 ms
)。这就是为什么结果是 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 方法