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 相关文章推荐
BBS(php & mysql)完整版(五)
Oct 09 PHP
使用PHP数组实现无限分类,不使用数据库,不使用递归.
Dec 09 PHP
PHP中使用CURL伪造来路抓取页面或文件
May 04 PHP
PHP系统命令函数使用分析
Jul 05 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
May 19 PHP
ThinkPHP的URL重写问题
Jun 22 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
Jun 25 PHP
Drupal简体中文语言包安装教程
Sep 27 PHP
php中遍历二维数组并以表格的形式输出的方法
Jan 03 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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导入Excel到MySQL的方法
2011/04/23 PHP
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
常用PHP封装分页工具类
2017/01/14 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
html文本框提示效果的示例代码
2014/06/28 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
Python新手实现2048小游戏
2015/03/31 Python
简单介绍Python中的JSON模块
2015/04/08 Python
在Python下尝试多线程编程
2015/04/28 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
Python实现的归并排序算法示例
2017/11/21 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
电子商务专业学生的学习自我评价
2013/10/27 职场文书
毕业生求职推荐信
2013/11/04 职场文书
校园网站的创业计划书范文
2013/12/30 职场文书
就业协议书样本
2014/08/20 职场文书
环境卫生倡议书
2014/08/29 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
MySQL分库分表详情
2021/09/25 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
2022/03/23 MySQL