[Laravel] Scope – 封裝條件
[Laravel] Scope – 封裝條件

[Laravel] Scope – 封裝條件

[Laravel] Scope - 封裝條件

最近開發Laravel因為功能性質的關係,很常會有以下情況
功能A需要撈取一個月訂單的編號跟金額
於是我們可能會在model order加入以下sql
(稍微補充一下,目前基於後續維護管理,所以傾向把sql的部分都集中在model)

#Model/Orders
public function getOrderByPeriod($start_date,$end_date)
{
    return $this->select('order_uid','order_amt')
            ->between("create_date",[$start_date,$end_date])    
            ->get()->toArray();
}

但接下來又有另外一個功能,他只要撈取訂單編號,難道我還要另外寫一個function只是select的欄位不同嗎?
而且其實我們對於傳入值的檢查都是針對日期,這樣這個model可能就會有越來越多重複的檢查

後來跟chatgbt討論XD加上爬了下官網(不過發現scope還有很多玩法XD之後應該可以再多看看)

目前優化做法是在Orders的Models採取下面做法

# Orders
public function scopeInPeriod($query ,$start_date,$end_date)
{
 // .....針對傳入日期做格式檢查
 return $query->between('create_date',[$start_date,$end_date]);
}

public function getOrderListforAfeature($start_date,$end_date)
{
    return self::InPeriod($start_date,$end_date)
            ->select('order_id','order_amt')
            ->get()->toArray();
}

public function getOrderDataForBFeature($start_date,$end_date)
{
    return self::InPeriod($start_date,$end_date)
            ->select('order_id')
            ->get()->toArray();
}
  • Scope function 一定要public
  • Scope function 一定是scope開頭
  • Scope function 要記得傳入$query,但是帶值進去不用特別帶,那是給laravel功能用的

目前覺得這個做法好處是

  • 減少重複檢查的邏輯
  • 檢查邏輯集中統一

壞處嘛XD

  • 如果有哪個小天才把共用的scope弄壞了就XDDDD
    • 所以scope那邊應該要是簡單易懂且經過驗證的~