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 远程文件管理,可以给表格排序,遍历目录,时间排序
Aug 07 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 PHP
数组与类使用PHP的可变变量名需要的注意的问题
Jun 20 PHP
php计算两个日期时间差(返回年、月、日)
Jun 19 PHP
php中动态修改ini配置
Oct 14 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
Jul 15 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 PHP
Thinkphp5结合layer弹窗定制操作结果页面
Jul 07 PHP
PHP二维关联数组的遍历方式(实例讲解)
Oct 18 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
May 02 PHP
ThinkPHP5.1验证码功能实现的示例代码
Jun 08 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
德生PL330的评价与改造
2021/03/02 无线电
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
详解json在php中的应用
2018/09/30 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
alert和confirm功能介绍
2014/05/21 Javascript
Bootstrap每天必学之下拉菜单
2015/11/25 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
JS实现新建文件夹功能
2017/06/17 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
Python中的迭代器漫谈
2015/02/03 Python
Python自动连接ssh的方法
2015/03/07 Python
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
Python实现自动上京东抢手机
2018/02/06 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
新闻网站实习自我鉴定
2013/09/25 职场文书
给老婆的婚前保证书
2014/02/01 职场文书
高中学生期末评语
2014/04/25 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技