入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

10.Laravel5学习笔记:Laravel中的批量赋值探索

创建时间:2015-07-23 投稿人: 浏览次数:4462

在使用laravel的 seed 功能的时候,经常有同学会看到以下这个异常

[IlluminateDatabaseEloquentMassAssignmentException]
username

这个异常是什么呢?意思就是,使用MODEL::create()这个方法的时候,Laravel为了保证系统的安全,防止有人恶意通过http请求来直接将某些字段创建时插入到数据库,造成破坏。

引用官网的原话

A mass-assignment vulnerability occurs when user’s pass unexpected HTTP parameters through a request, and then that parameter changes a column in your database you did not expect. For example, a malicious user might send an is_admin parameter through an HTTP request, which is then mapped onto your model’s create method, allowing the user to escalate themselves to an administrator.


首先假设我们的 Seeder 是这样的

    public function run()
    {
        DB::table("addresss")->delete();

        Address::create([
            "user_id" => 1,
            "identity" => 1,
            "longlat" => "XXXXX",
            "province" => "XXX",
            "city" => "XXX",
            "district" => "XXX",
            "detail" => "XXXX",
        ]);
    }

此时如果 Address 这个model没有设置 fillable 或者 guarded 两个属性,而直接使用
php artisan db:seed --class="AddressTableSeeder" 的话,就会报上面的错误。假设在 Address 中设置了 fillable

protected $fillable = ["user_id", "identity", ];

此时如果执行 seed 命令,数据库中新增加的数据只会有 user_ididentity 这两个字段。

通过以上这个过程可以明确了解到批量赋值的深意了吧。所以想要在创建的时候完成所有数据的插入,应该将所有的字段均设置到 fillable 中去。


偶尔也会遇到一张表中的字段太多了,有同学说一个个写到 fillable 中是不是太蛋碎了呀。Laravel这款号称史上最优雅的框架,怎么可能没有考虑到这个事情呢。所有还有一个 guarded 这个属性供你使用嘛。字段太多的时候,你把需要禁止批量赋值的字段设置到它里边就好了。

学海无涯呀!继续加油推进,最近开始使用laravel在做app的后端服务了。已经分享了一些自己结合第三方SDK改造的工具。

  • 百度消息推送 Laravel composer包
  • 自动生成API接口文档 Laravel composer包
  • 百度富文本工具 Laravel composer包

Laravel5专题目录

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。