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 相关文章推荐
phpmyadmin操作流程
Oct 09 PHP
php错误、异常处理机制(补充)
May 07 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 PHP
php中实现xml与mysql数据相互转换的方法
Dec 25 PHP
浅谈php冒泡排序
Dec 30 PHP
PHP中trim()函数简单使用指南
Apr 16 PHP
浅谈PHP中静态方法和非静态方法的相互调用
Oct 04 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
php 使用curl模拟ip和来源进行访问的实现方法
May 02 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
PHP多维数组指定多字段排序的示例代码
May 16 PHP
php 中的信号处理操作实例详解
Mar 04 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开启gzip页面压缩实例代码
2010/03/11 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
Python实现方便使用的级联进度信息实例
2015/05/05 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
2014年度思想工作总结
2014/11/27 职场文书
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers