2021-01-11|閱讀時間 ‧ 約 4 分鐘

Laravel model: fillable, guarded

在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來更新。
分享至
成為作者繼續創作的動力吧!
小弟是一位軟體工程師,樂於幫助他人,撰寫技術文章除了幫助自己複習以外,也希望可以幫助到他人,若文章內容有誤,還請大大不吝給予指教!
© 2024 vocus All rights reserved.