Laravel中批量赋值Mass-Assignment的真正含义详解


Posted in PHP onSeptember 29, 2017

前言

很多人初次遇到 批量赋值 的时候,很容易理解成 批量添加多条数据,实际并非如此。下面话不多说了,请看下面的例子。

假设用户表 users 结构如下,且通过 is_admin 字段值为 1 或 0 来判断用户是否为 管理员,其中 is_admin 字段默认值为 0:

+----+-----------+------------------+----------+--------------------------------------------------------------+
| id | name  | email   | is_admin | password              |
+----+-----------+------------------+----------+--------------------------------------------------------------+
| 1 | seekerliu | me@seekerliu.com |  1 | $2y$10$RL6r.MwoJd.oOvKRYhUpmeQI6hUpoG/KgGNhA6X5JrRqfVbooCs92 |
+----+-----------+------------------+----------+--------------------------------------------------------------+

正常情况下,我们通过这种方式新建一个 普通 用户:

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() 获取用户提交的所有表单数据:

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 (批量赋值) 。

Laravel 提供了保护 Mass-Assignment 的方法,那就是在模型上定义 fillable 或 guarded 的属性,例如:

class User extend Model
{
 protected $fillable = ['name', 'email', 'password'];
}

或:

class User extend Model
{
 protected $guarded = ['is_admin'];
}

这样,在执行 create() 方法时,Eloquent 模型会先使用 fill() 方法对数据进行过滤,去掉 $fillable 以外的字段(白名单),或去掉 $guarded 中的字段(黑名单),来保证只获取预期的表单字段。

以上就是 Laravel 的 Mass-Assignment 。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
详细介绍PHP应用提速面面观
Oct 09 PHP
中篇:安装及配置PHP
Dec 13 PHP
php 错误处理经验分享
Oct 11 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
Jun 22 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
php运行时动态创建函数的方法
Mar 16 PHP
PHP mysql事务问题实例分析
Jan 18 PHP
php cookie 详解使用实例
Nov 03 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
详解PHP中的序列化、反序列化操作
Mar 21 PHP
PHP APP微信提现接口代码
Sep 30 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
WHOOPS PHP调试库的使用
Sep 29 #PHP
Laravel中获取路由参数Route Parameters的五种方法示例
Sep 29 #PHP
PHP网页安全认证的实例详解
Sep 28 #PHP
php二维码生成以及下载实现
Sep 28 #PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 #PHP
PHP面向对象多态性实现方法简单示例
Sep 27 #PHP
PHP实现使用DOM将XML数据存入数组的方法示例
Sep 27 #PHP
You might like
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
PHP 可阅读随机字符串代码
2010/05/26 PHP
PHP函数实现分页含文本分页和数字分页
2014/10/23 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
Prototype使用指南之selector.js
2007/01/10 Javascript
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
python使用xslt提取网页数据的方法
2018/02/23 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
python解包用法详解
2021/02/17 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
五年后的职业生涯规划
2014/03/04 职场文书
农林环境专业求职信
2014/03/13 职场文书
2015年教师节感言
2015/08/03 职场文书
七个Python必备的GUI库
2021/04/27 Python
win10搭建配置ftp服务器的方法
2022/08/05 Servers