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 相关文章推荐
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
codeigniter中view通过循环显示数组数据的方法
Mar 20 PHP
使用GD库生成带阴影文字的图片
Mar 27 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
Aug 18 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
Dec 01 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
PHP常用的三种设计模式
Feb 17 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
PHP PDOStatement::errorCode讲解
Jan 31 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
Sep 17 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
实用函数9
2007/11/08 PHP
php获取服务器信息的实现代码
2013/02/04 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
JavaScript模块随意拖动示例代码
2014/05/27 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
Python获取服务器信息的最简单实现方法
2015/03/05 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
2018/04/28 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
实例详解Python模块decimal
2019/06/26 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
浅析HTML5 Landmark
2020/09/11 HTML / CSS
韩国现代百货官网:Hmall
2018/03/21 全球购物
Android面试题附答案
2014/12/08 面试题
办加油卡单位介绍信
2014/01/09 职场文书
高三英语教学反思
2014/01/13 职场文书
平安工地建设方案
2014/05/06 职场文书
奉献爱心演讲稿
2014/09/04 职场文书
2014年科技工作总结
2014/11/26 职场文书
2015年七一建党节慰问信
2015/03/23 职场文书
关于环保的广播稿
2015/12/17 职场文书