Laravel 5.6中使用updateOrCreate报fillable异常问题求助
解决Laravel 5.6中updateOrCreate的"fillable"异常问题
这个异常其实是Laravel的MassAssignmentException,核心原因是你在updateOrCreate里用到的字段,没有在AppToken模型中声明为允许批量赋值的字段。
具体解决步骤:
- 找到你的
AppToken模型文件(通常在app/AppToken.php,如果是按规范分目录的结构,可能在app/Models/AppToken.php) - 在模型类中添加
$fillable属性,把你需要批量赋值的字段全部列进去——包括updateOrCreate第一个参数里的查询字段(因为创建新记录时这些字段也会被赋值),以及第二个参数里的字段:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class AppToken extends Model { // 声明允许批量赋值的字段 protected $fillable = [ 'user_id', 'token', 'expiry', 'created_date' // 把你代码里没写完的那个字段(比如mo开头的字段)也补充进来 ]; }
为什么会出现这个问题?
Laravel默认会保护模型避免批量赋值漏洞,只有在$fillable里明确列出的字段,才能通过create()、update()或者updateOrCreate()这类批量赋值方法进行赋值。你代码里的updateOrCreate在创建新Token时,会把user_id、token、expiry、created_date这些字段一起赋值给模型,只要有一个没在$fillable里,就会抛出这个异常。
可选方案(不推荐生产环境)
如果你想快速测试或者确定所有字段都可以安全赋值,也可以在模型里设置$guarded = [];,表示没有字段被保护,所有字段都允许批量赋值:
protected $guarded = [];
但这种方式在生产环境有安全风险,建议还是明确指定$fillable字段。
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

