Laravel 中 Model `update()` 报错:`MassAssignmentException in Model.php line 452: _url`
Model.php
452 行是 fill() 函数,通过溯源找到调用位置 update()
:
return $this->fill($attributes)->save($options);
回到 fill()
函数,函数体内对 $attributes
,也就是传入的更新数组参数,进行遍历,判断字段 key 是否可填充。如果可以填充则设置 model 属性,否则判断是否模型完全看守,如果是,则抛出异常 MassAssignmentException
。
模型完全看守的判定条件是 $fillable
属性(数组)为空,看守属性为默认的 [*]
(所有属性)。也就是说,在批量更新属性时,需要设置模型的可填属性 $fillable
,否则就抛出异常。可以使用 Eloquent::unguard();
关闭看守。
所以对相关模型设置 $fillable
属性即可解决该问题。
class Test extends Model
{
protected $fillable = ['id', 'xxx'];
}
后续如果修改或添加了表字段,而该字段是通过 update()
更新的,那么也需要记得修改或添加 $fillable
数组元素,不然数据是无法写入到表中的。