Laravel Eloquent Date Restrictions 時間限制
當我在們撰寫 Laravel Eloquent 經常會遇到一個情境,就是時間上的對比這件事情,例如:這篇活動公告是否在活動時間內,那麼我們可以預想的到,這個活動可能會有個 起始時間
與 結束時間
剩下就是時間運算的程式撰寫。
實際案例
我有一個活動的首頁輪播,使用者在上架時必須要填寫這張圖片的 起始時間
與 結束時間
如果 現在時間
還未到 起始時間
或是超過 結束時間
就不會顯示出來。
那麼為何有這樣的需求呢?~~因為懶~~ 因為未必會有人想在半夜進到網站後台發表資料,一定會想先一次上好,再來等時間到程式幫我們發佈出來就好。
程式碼撰寫 時間限制 邏輯
在此之前要先 感恩 Eloquent 讚嘆 Eloquent 讓我可以不用寫 SQL 語法就可以搞定事情。
app/Http/Controllers/HomeController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Slideshow;
class HomeController extends Controller
{
//...
public static function getSlideshow()
{
$slideshow=Slideshow::published()->get();
return $slideshow;
}
}
我們有一個 HomeController
他會負責把已經發佈的 Slideshow
資料吐給前端顯示,那麼主要判斷時間發佈會是在 published()
內。
app/Models/Slideshow.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
class Slideshow extends Model
{
protected $table = 'slideshow';
//...
/**
* 查詢 現在時間 介於 發布時間 與 結束時間 的 Scope
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopePublished($query)
{
$now = Carbon::now();
// 寫法 1
$query->where(function ($query) use ($now) {
$query->where('start_date', '<=', $now);
$query->where('end_date', '>=', $now);
});
// 寫法 2
$query->where('start_date', '<=', $now);
$query->where('end_date', '>=', $now);
// 寫法 3
$query->whereRaw('? between start_date and end_date', [$now]);
return $query;
}
}
當然不考慮效能的話,你可以選一個你覺得你自己跟別人,未來都看得懂的寫法,可以看一下每個寫法組出來的 SQL 語法,如下圖。
寫法 1
寫法 2
寫法 3
我會是比較喜歡寫法 3 簡單易讀,我也是有想過使用 whereBetween
這個方法,可是他是要給一個 資料庫欄位
跟兩個 value
去比較,對於情境來說,我們不會有現在時間這個 欄位
所以才會選擇使用以上方法來解決。
whereBetween
方法驗證一個欄位的值介於兩個值之間:
$users = DB::table('users')
->whereBetween('votes', [1, 100])
->get();
結論
不管你是使用哪個方法,都可以達成我們要的目的,因為目前資料量也不多,所以也無法驗證哪個查詢方式最快最好,當你資料量大時再考慮效能瓶頸的問題吧。
參考資料
資料庫:查詢建構器
Laravel Eloquent Date Range – Query between two dates
SQL BETWEEN Two Columns in Laravel/Lumen