解决laravel批量插入或者使用firstOrCreate/updateOrCreate出现MassAssignmentException错误
Song •
4427 次浏览 •
0个评论 •
2018年03月27日
laravel批量插入或者使用firstOrCreate/updateOrCreate出现MassAssignmentException错误,
MassAssignmentException in Model.php line 452
你需要先在你的模型上定义一个fillable或guarded属性,因为所有的Eloquent模型都针对批量赋值(Mass-Assignment)做了保护。
当用户通过HTTP请求传入了非预期的参数,并借助这些参数更改了数据库中你并不打算要更改的字段,这时就会出现批量赋值(Mass-Assignment)漏洞。例如,恶意用户可能会通过HTTP请求发送is_admin参数,然后对应到你模型的create方法,此操作能让该用户把自己升级为一个管理者。
一、fillable方法
你应该定义好哪些模型属性是可以被批量赋值的。你可以在模型上使用$fillable属性来实现。
class User extends Model
{
protected $fillable = ['username', 'email', 'password'];
}
二、guarded方法
$fillable作为一个可以被批量赋值的属性「白名单」。另外你也可以选择使用$guarded。$guarded属性应该包含一个你不想要被批量赋值的属性数组。所有不在数组里面的其它属性都可以被批量赋值。因此,$guarded 的功能更类似一个「黑名单」。使用的时候应该只选择$fillable或$guarded中的其中一个。 下面这个例子中,除了price所有的属性都可以被批量赋值:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 不可被批量赋值的属性。
*
* @var array
*/
protected $guarded = ['price'];
}
如果你想让所有的属性都可以被批量赋值,你应该定义 $guarded为空数组。
/**
* 不可被批量赋值的属性。
*
* @var array
*/
protected $guarded = [];
-
laravel分批次处理大量数据以及chunk函数的使用方法 2018-03-26 -
Laravel5.*实现FULL TEXT全文索引分页以及laravel实现文章标题和内容模糊搜索 2018-03-17 -
mysql/Mariadb开启全文检索fulltext配置以及大数据搜索优化 2018-03-17 -
mysql/Mariadb开启mysql慢查询对数据库进行优化 2018-03-16 -
[ laravel-mongodb教程 ] laravel使用MongoDB过程中常见错误与解决办法 2018-03-14

更多相关好文