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 相关文章推荐
跟我学小偷程序之成功偷取首页(第三天)
Oct 09 PHP
图形数字验证代码
Oct 09 PHP
超强分页类2.0发布,支持自定义风格,默认4种显示模式
Jan 02 PHP
在PHP中使用反射技术的架构插件使用说明
May 18 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
Apr 25 PHP
解决ajax+php中文乱码的方法详解
Jun 09 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
Nov 25 PHP
PHP性能分析工具xhprof的安装使用与注意事项
Dec 19 PHP
PHP实现一个轻量级容器的方法
Jan 28 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 PHP
php生成短网址/短链接原理和用法实例分析
May 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自动给文章加关键词链接的函数代码
2012/11/29 PHP
PHP调试函数和日志记录函数分享
2015/01/31 PHP
php实现多城市切换特效
2015/08/09 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
python3注册全局热键的实现
2020/03/22 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
2020/10/29 Python
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
营业经理岗位职责
2013/11/10 职场文书
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
原材料检验岗位职责
2014/03/15 职场文书
学校学雷锋活动总结
2014/06/26 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
Python 语言实现六大查找算法
2021/06/30 Python
python利用while求100内的整数和方式
2021/11/07 Python