初次遇到
批量賦值
的時候,很容易理解成批量添加多條數據
,實際並不是如此。請看下面的例子。php
假設用戶表 users
結構以下,且經過 is_admin
字段值爲 1
或 0
來判斷用戶是否爲 管理員
,其中 is_admin
字段默認值爲 0
:laravel
+----+-----------+------------------+----------+--------------------------------------------------------------+ | id | name | email | is_admin | password | +----+-----------+------------------+----------+--------------------------------------------------------------+ | 1 | seekerliu | me@seekerliu.com | 1 | $2y$10$RL6r.MwoJd.oOvKRYhUpmeQI6hUpoG/KgGNhA6X5JrRqfVbooCs92 | +----+-----------+------------------+----------+--------------------------------------------------------------+
正常狀況下,咱們經過這種方式新建一個 普通
用戶:git
public function store (Request $request) { $user = new \App\User; // 賦值 $user->name = $request->name; $user->email = $request->email; $user->password = bcrypt($request->password); // 新建一個用戶 $user->save(); }
爲了方便,咱們能夠使用 $request->all()
獲取用戶提交的全部表單數據:github
public function store (Request $request) { $user = new \App\User; // Mass-Assignment 批量賦值 $data = $request->all(); // 新建一個用戶 $user->create($data); }
這種狀況下,若是用戶提交正確的表單數據,例如: ['name' => 'liu', 'email' => 'liu@seekerliu.com', 'password' => 'test']
,會新建一個 普通
用戶。
但只要用戶在表單中僞造一個 ['is_admin' => 1]
字段,就能新建一個 管理員
用戶。
這種經過將一大堆數據同時傳遞給模型的 create()
方法來新建一行的方式就是 Mass-Assignment (批量賦值)
。bash
Laravel
提供了保護 Mass-Assignment
的方法,那就是在模型上定義 fillable
或 guarded
的屬性,例如:code
class User extend Model { protected $fillable = ['name', 'email', 'password']; }
或:ip
class User extend Model { protected $guarded = ['is_admin']; }
這樣,在執行 create()
方法時,Eloquent
模型會先使用 fill()
方法對數據進行過濾,去掉 $fillable
之外的字段(白名單),或去掉 $guarded
中的字段(黑名單),來保證只獲取預期的表單字段。get
以上就是 Laravel
的 Mass-Assignment
。it
原創。 全部 Laravel 文章均已收錄至 laravel-tips 項目。io