[英]Laravel Eloquent compare date from datetime field
我想通过表达式从表中获取所有行:
table.date <= 2014-07-10
但是,如果该列包含日期时间,让我们说:
2014-07-10 12:00:00
但如果我这样做:
where('date', '<=', $date)
它不会得到行。
我猜这是因为 $date = 2014-07-10 这让 MySQL 假设它是 2014-07-10 00:00:00。
在常规 MySQL 中,我会做
where DATE(date) <= $date
使用 Laravel 的 Eloquent 等效于什么?
Laravel 4+ 为您提供了这些方法: whereDay()
、 whereMonth()
、 whereYear()
( #3946 ) 和whereDate()
( #6879 )。
他们为您执行 SQL DATE()
工作,并管理 SQLite 的差异。
你的结果可以这样实现:
->whereDate('date', '<=', '2014-07-10')
有关更多示例,请参阅#3946 的第一条消息和这篇Laravel Daily 文章。
更新:虽然上述方法很方便,但正如 Arth 指出的那样,它在大型数据集上效率低下,因为必须在每条记录上应用DATE()
SQL 函数,从而丢弃可能的索引。
以下是进行比较的一些方法(但请阅读下面的注释):
->where('date', '<=', '2014-07-10 23:59:59')
->where('date', '<', '2014-07-11')
// '2014-07-11'
$dayAfter = (new DateTime('2014-07-10'))->modify('+1 day')->format('Y-m-d');
->where('date', '<', $dayAfter)
笔记:
您是否考虑过使用:
where('date', '<', '2014-08-11')
您应该避免在 MySQL 中的索引列上使用DATE()
函数,因为这会阻止引擎使用索引。
更新
由于似乎对DATE()
和索引的重要性存在一些分歧,我创建了一个演示差异的小提琴,请参阅POSSIBLE KEYS
。
您可以使用它获取日期“2016-07-14”的所有记录
whereDate('date','=','2016-07-14')
或者使用另一个代码作为动态日期
whereDate('date',$date)
你可以用这个
whereDate('date', '=', $date)
如果您提供 whereDate,则仅比较日期时间字段中的日期。
如果您仍然想知道如何解决它。
我用
$protected $dates = ['created_at','updated_at','aired'];
在我的模型和我做的地方
where('aired','>=',time())
所以只需使用unix来比较在哪里。
另一方面,在视图中,您必须使用日期对象。
希望它可以帮助某人!
这是我的逻辑:如果您正在比较日期,那么您的方法应该是 whereDate,如果您比较完整的日期时间,那么您的方法将只在:
$calendar_alert = DB::table('calendar_alerts')->whereDate('when', '=', now()->format('Ym-d'))->where('when', '>', now()->format('H:i:s'))->get();
use Carbon\Carbon;
public function scopePublished($query)
{
$now = Carbon::now();
$date = Carbon::parse($now)->toDateString();
$time = Carbon::parse($now)->toTimeString();
return $query->whereDate('published_at', '<', $date)
->orWhere(function($query) use ($date, $time) {
$query->whereDate('published_at', '=', $date)
->whereTime('published_at', '<=', $time);
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.