我试图理解 Laravel 中查询 MySQL 数据库时 whereDate() 和 where() 方法之间的区别。这是一个例子来说明我的困惑:
1:使用 whereDate():
$posts = Post::whereDate('created_at', Carbon::today())->get();
2:使用where():
$posts = Post::where('created_at', Carbon::today())->get();
有人可以解释一下这两种方法之间的区别以及它们在上面的示例中使用时返回的结果吗?如果我想获取今天创建的所有帖子,无论时间如何,我应该使用哪一个?
预先感谢您的帮助!
whereDate
会将表达式的左侧在比较之前转换为日期。
因此,假设存在时间组件,那么时间不是操作的一部分。
where
依赖于mysql引擎本身完成的转换,并且感觉不太可预测。但它会尝试直接比较它,并且根据右侧表达式中传递的字符串和 mysql 的引擎配置可以执行完全相同的操作,或者查找直接时间点并将右侧转换为时间戳,然后比较它们是否完全相等。
-- where version
select * from posts where created_at = '2024-12-18';
-- where version potentially depending on the output of carbon when converted.
select * from posts where created_at = '2024-12-18 00:00';
-- whereDate version
select * from posts where Date(created_at) = '2024-12-18';
因此,将时间戳的数据类型转换为没有时间组件的日期可以更直接地声明您的意图。
这篇文章有一个很好的解释方式:https://laraveldaily.com/post/eloquent-date-filtering-wheredate-and-other-methods