资讯专栏INFORMATION COLUMN

Laravel Mass-Assignment (批量赋值) 的真正含义

luxixing / 2462人阅读

摘要:初次遇到批量赋值的时候,很容易理解成批量添加多条数据,实际并非如此。请看下面的例子。但只要用户在表单中伪造一个字段,就能新建一个管理员用户。这种通过将一大堆数据同时传递给模型的方法来新建一行的方式就是批量赋值。所有文章均已收录至项目。

初次遇到 批量赋值 的时候,很容易理解成 批量添加多条数据,实际并非如此。请看下面的例子。

假设用户表 users 结构如下,且通过 is_admin 字段值为 10 来判断用户是否为 管理员,其中 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 AppUser;
        
    // 赋值
    $user->name = $request->name;
    $user->email = $request->email;
    $user->password = bcrypt($request->password);
        
    // 新建一个用户
    $user->save();
}

为了方便,我们可以使用 $request->all() 获取用户提交的所有表单数据:

public function store (Request $request)
{
    $user = new AppUser;
        
    // 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 的方法,那就是在模型上定义 fillableguarded 的属性,例如:

class User extend Model
{
    protected $fillable = ["name", "email", "password"];
}

或:

class User extend Model
{
    protected $guarded = ["is_admin"];
}

这样,在执行 create() 方法时,Eloquent 模型会先使用 fill() 方法对数据进行过滤,去掉 $fillable 以外的字段(白名单),或去掉 $guarded 中的字段(黑名单),来保证只获取预期的表单字段。

以上就是 LaravelMass-Assignment

原创。 所有 Laravel 文章均已收录至 laravel-tips 项目。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25932.html

相关文章

  • 使用 Baum 嵌套集合模型来实现 Laravel 模型无限极分类

    摘要:本文经授权转自社区使用嵌套集合模型来实现模型的无限极分类说明大家通常都是使用递归实现无限极分类,都知道递归效率很低,下面推荐一个的扩展包,快速让你的数据模型支持无限极树状层级结构,并且兼顾效率。 本文经授权转自 PHPHub 社区 使用 Baum 嵌套集合模型来实现 Laravel 模型的无限极分类 说明 大家通常都是使用递归实现无限极分类,都知道递归效率很低,下面推荐一个 Larav...

    superPershing 评论0 收藏0
  • Laravel Eloquent 之 Fill 方法解析

    摘要:上一次分析了中的模型事件与观察者模式这次来解析一下中的用的童鞋应该都知道方法是一个给实例赋值属性的方法让我们点开方法先看一看它的源码这里笔者所使用的版本为最新版为了方便阅读删除掉了注释首先可以看到会先去调用一个自身的方法让我们点开 上一次分析了 Laravel 中的模型事件与观察者模式,这次来解析一下 Eloquent 中的 fill 用 Laravel 的童鞋应该都知道,fill 方...

    skinner 评论0 收藏0
  • laravel

    摘要:什么事是一种类库依赖关系管理器网址下载命令创建项目项目文件说明是压缩文件下载到哪个目录版本在中需要给和赋予权限路由,请求的一级分发者请求请求资源型请求会多几条的路由控制器,请求的二级分发者快速创建控制器查看路由列表控制器给视图层传参 1.什么事composer?composer是一种php类库依赖关系管理器网址:https://getcomposer.org/2.composer下载l...

    GeekGhc 评论0 收藏0
  • Laravel 5.4 入门系列 8. 文章评论

    摘要:编辑迁移文件我们为表格添加了外键,同时生定义了约束,该约束允许删除父表文章的时候,自动删除关联的子表评论。关联中文文档的辅助函数列表中文文档 本节将学习 Eloquent Relations,表与表之间存在着多种关系,举例如下: 一对一:文章与作者 一对多:文章与评论 多对多:标签与文章 文章与评论的一对多关系 一对多关系,主要理解两点: 如何实现一对多关系 实现了之后能给开发带...

    IntMain 评论0 收藏0
  • laravel批量更新多条记录,可防止SQL注入

    摘要:写在前面熟悉的童鞋都知道,有批量一次性插入多条记录,却没有一次性按条件更新多条记录。本篇文章,结合的做了调整,可有效防止注入。 写在前面 熟悉laravel的童鞋都知道,laravel有批量一次性插入多条记录,却没有一次性按条件更新多条记录。 是否羡慕thinkphp的saveAll,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的方法呢? ...

    Drummor 评论0 收藏0

发表评论

0条评论

luxixing

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<