我有一个包含代码的实体存储库
/**
* @ORM\Column(type="date", unique=true, nullable=false)
* @ORM\Id()
*/
private $disable_date;
实体只包含一个成员(disable_date)
FormEvent
当我尝试检查今天的日期是否在数据库中时,上面的代码返回NULL。 DB中的日期存在。 到底是什么?
答案 0 :(得分:3)
因为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
的日期
答案 1 :(得分:1)
我使用午夜修改器解决了这个问题。
在原则上声明“日期”字段时,它将在数据库中存储为日期时间,但是实体使用DateTime接口。
因此,如果您尝试将新的\ 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方法中应用