laravel模型批量赋值报错主因是字段未在$fillable中声明,需检查并添加如'sfa_id'、'startdatum'等字段,确保拼写一致;批量方法如create、fill、update均受此保护,手动赋值除外。

Laravel 模型批量赋值报错,绝大多数情况是 字段未被允许写入,而不是代码写错了。核心问题在于 Eloquent 的批量赋值保护机制——它只放行 $fillable 中列出的字段,其余一律静默丢弃。比如你传了 sfa_id 或 startdatum,但模型没声明,数据库就收不到值,轻则存为 0000-00-00,重则直接报 Field doesn't have a default value。
检查并修正 $fillable 数组
这是最常见也最该优先做的操作:
- 打开对应模型文件(如
app/Models/StudentMeal.php) - 找到
protected $fillable = [...];这一行 - 把报错字段(如
'sfa_id'、'startdatum'、'enddatum')加进去,确保拼写和大小写完全一致 - 如果模型用的是
$guarded = ['*'],建议改为显式定义$fillable,更安全可控
确认你用的是批量赋值方法
不是所有写入方式都受 $fillable 约束,要分清场景:
-
Model::create($data)、$model->fill($data)、$model->update($data)—— 受保护,必须走$fillable -
Model::firstOrCreate($data)、Model::updateOrCreate($data, $values)—— 同样受保护,不能绕过 - 手动逐个赋值再
save()(如$model->sfa_id = ...; $model->save();)—— 不受$fillable限制,但不推荐用于表单场景
排除其他干扰因素
填对 $fillable 后还出错?再顺手核对这几项:
- 用
dd($request->all())或dd($tally_meal)确认数据确实传到了控制器,且键名正确(比如不是'SFA_ID'或'sfaId') - 检查数据库字段是否真为
NOT NULL且无默认值,否则即使忽略赋值也不会报错 - 确认字段类型匹配:比如
sfa_id是外键,应为BIGINT UNSIGNED;日期字段要用DATE或DATETIME类型 - 不要用
Model::unguard()临时解禁——这会打开安全缺口,尤其在线上环境极危险
问题本质清晰:Laravel 不是“报错”,而是在按设计守门。只要让字段进白名单,数据就能稳稳落库。











