[英]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.