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 模拟POST提交的2种方法详解
Jun 17 PHP
PHP中exec与system用法区别分析
Sep 22 PHP
php中动态修改ini配置
Oct 14 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 PHP
Yii框架上传图片用法总结
Mar 28 PHP
Yii中CGridView禁止列排序的设置方法
Jul 12 PHP
php实现文件上传及头像预览功能
Jan 15 PHP
PHP开发之用微信远程遥控服务器
Jan 25 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 PHP
php+js实现的无刷新下载文件功能示例
Aug 23 PHP
使用laravel的migrate创建数据表的方法
Sep 30 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+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
javascript中如何处理引号编码"
2013/08/15 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
深入理解Vue router的部分高级用法
2018/08/15 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
Python通过解析网页实现看报程序的方法
2014/08/04 Python
Python中的choice()方法使用详解
2015/05/15 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
深入理解Python中的内置常量
2017/05/20 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Python实现TCP通信的示例代码
2019/09/09 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
python 基于opencv实现图像增强
2020/12/23 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
大家访活动实施方案
2014/03/10 职场文书
职业生涯规划书范文
2014/03/10 职场文书
父母对孩子说的话
2014/04/12 职场文书
检讨书大全
2015/01/27 职场文书
服务员岗位职责
2015/02/03 职场文书
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js