[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那邊應該要是簡單易懂且經過驗證的~