当前位置: 首页 > 后端技术 > PHP

LaravelMass-Assignment(批量赋值)的真正含义

时间:2023-03-29 21:08:26 PHP

第一次遇到批量赋值,很容易理解为批量添加多条数据,其实不然。请看下面的例子。假设用户表users的结构如下,is_admin字段的值为1或0来判断用户是否为管理员,is_admin字段默认值为0:+----+-----------+----------------+--------+------------------------------------------------------+|编号|姓名|电邮|是_admin|密码|+----+------------+----------------+---------+-------------------------------------------------------------+|1|搜索者刘|me@seekerliu.com|1|$2y$10$RL6r.MwoJd.oOvKRYhUpmeQI6hUpoG/KgGNhA6X5JrRqfVbooCs92|+----+----------+--------------------+-----------+------------------------------------------------------------+通常情况下,我们通过这种方式创建一个新的普通用户:publicfunctionstore(Request$request){$user=new\App\用户;//赋值$user->name=$request->name;$user->email=$request->email;$user->password=bcrypt($request->password);//创建一个新用户$user->save();}为了方便,我们可以使用$request->all()获取用户提交的所有表单的个数根据:publicfunctionstore(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(批量赋值)。Laravel提供了一种保护Mass-Assignment的方法,即在模型上定义可填充或受保护的属性,例如:classUserextendModel{protected$fillable=['name','email','password'];}或:classUserextendModel{protected$guarded=['is_admin'];}这样,在执行create()方法时,Eloquent模型会先使用fill()方法过滤数据,去掉$以外的字段fillable(whitelist),或者删除$guarded(blacklist)中的字段以确保只获取预期的表单字段。以上是Laravel的Mass-Assignment。原来的。所有Laravel文章都包含在laravel-tips项目中。