Laravel Eloquent Date Restrictions 時間限制

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