在Model中常看到這兩個屬性fillable, guarded:
protected $fillable=['name','job'];
protected $guarded=['user_id'];
其中guarded是黑名單的意思,fillable則是白名單。
以上面的例子來說,假如我table裡面只有name, job, user_id三個欄位,由於user_id是設為guarded,表示這個欄位不能被塞進去,因此orm轉換後的insert sql就不會包含這個欄位,即使request param故意帶入user_id也不會塞進去。
這兩個屬性是用來設定是否允許批量注入的意思,也就是當我直接下:
$this->model->create(request()->all());
把所有request params直接insert進db,哪些欄位是被允許的,哪些是不允許。
或者直接把request params拿來更新資料:
$id = request()->input('id');
$data = request()->input('data');
$db_data = $this->model->find($id);
if($db_data != null){
$db_data ->fill($data);
$db_data ->save();
}
有被允許的param才能透過fill()更新db資料!
後記:
當想要讓所有欄位都允許批量注入時,可以這樣設定:
protected $guarded = [];
沒有黑名單,也就是全部欄位都是白名單。
這時候下->create(request()->all()); 就可以直接把request參數全insert進table。
用request all params來更新某一筆資料:
request json如下:
{
"customer_id": "6",
"data": {
"name": "ss",
"nickname": ""
}
}
code:
$customer_id = request()->input('customer_id');
$customer = $this->customer->find($customer_id);
$customer->fill(request()->input('data'));
$customer->save();
有給的欄位就會更新,沒給的欄位就不會更改。
跟上述提到的白黑名單也有關係,白名單的欄位才能直接從request param來更新。