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乱码问题
Mar 25 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
Feb 02 PHP
如何使用php判断服务器是否是HTTPS连接
Jul 05 PHP
2014过年倒计时示例
Jan 31 PHP
phpmailer中文乱码问题的解决方法
Apr 22 PHP
PHP高手需要要掌握的知识点
Aug 21 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
Nov 15 PHP
php中实现可以返回多个值的函数实例
Mar 21 PHP
Yii2中SqlDataProvider用法示例
Sep 22 PHP
php插入含有特殊符号数据的处理方法
Nov 24 PHP
php实现的二叉树遍历算法示例
Jun 15 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
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
点击表单提交时出现jQuery没有权限的解决方法
2014/07/23 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
关于Python作用域自学总结
2019/06/10 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
客户表扬信范文
2014/01/10 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
python urllib库的使用详解
2021/04/13 Python
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android