问题描述
在使用laravel的 seed 功能的时候,经常有同学会看到以下这个异常
[Illuminate\Database\Eloquent\MassAssignmentException]
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_id 与 identity 这两个字段。
通过以上这个过程可以明确了解到批量赋值的深意了吧。所以想要在创建的时候完成所有数据的插入,应该将所有的字段均设置到 fillable 中去。
字段太多怎么办偶尔也会遇到一张表中的字段太多了,有同学说一个个写到 fillable 中是不是太蛋碎了呀。Laravel这款号称史上最优雅的框架,怎么可能没有考虑到这个事情呢。所有还有一个 guarded 这个属性供你使用嘛。字段太多的时候,你把需要禁止批量赋值的字段设置到它里边就好了。
学海无涯呀!继续加油推进,最近开始使用laravel在做app的后端服务了。已经分享了一些自己结合第三方SDK改造的工具。
版权声明:本文为博主原创文章,未经博主允许不得转载。