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下打开URL地址的几种方法小结
May 16 PHP
PHP数组无限分级数据的层级化处理代码
Dec 29 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
Jun 03 PHP
简单实用的.net DataTable导出Execl
Oct 28 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
Mar 08 PHP
destoon复制新模块的方法
Jun 21 PHP
php的GD库imagettftext函数解决中文乱码问题
Jan 24 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
PHP解耦的三重境界(浅谈服务容器)
Mar 13 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
May 12 PHP
PHP解析url并得到url参数方法总结
Oct 11 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
Dec 12 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生成随机数或者字符串的代码
2008/09/05 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
Javascript的一种模块模式
2008/03/22 Javascript
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
循环 vs 递归浅谈
2013/02/28 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
Python基础之函数用法实例详解
2014/09/10 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
酒店管理专业学生求职信
2013/09/27 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
实习科室评语
2015/01/04 职场文书
学习保证书100字
2015/02/26 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
MySQL创建管理KEY分区
2022/04/13 MySQL
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫