
Laravel 模型的 $fillable 属性未包含 sfa_id 字段,导致 StudentMeal::create() 忽略该字段,引发数据库报错“Field 'sfa_id' doesn't have a default value”。
laravel 模型的 `$fillable` 属性未包含 `sfa_id` 字段,导致 `studentmeal::create()` 忽略该字段,引发数据库报错“field 'sfa_id' doesn't have a default value”。
在 Laravel 中,Model::create() 方法仅允许对 $fillable(白名单)中声明的字段进行批量赋值(mass assignment)。尽管你在控制器中显式设置了 $tally_meal['sfa_id'] = auth()->user()->sfa->id;,但如果 sfa_id 不在 StudentMeal 模型的 $fillable 数组中,Laravel 会直接丢弃该字段 —— 这正是 SQL 报错 Field 'sfa_id' doesn't have a default value 的根本原因。
✅ 正确做法:打开 app/Models/StudentMeal.php,确保 sfa_id 已加入 $fillable:
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class StudentMeal extends Model
{
protected $fillable = [
'date_served',
'meal_type_id',
'tally',
'site_id',
'user_id',
'sfa_id', // ✅ 必须添加此项
];
}⚠️ 注意事项:
- 若使用 $guarded = [](即全开放),虽可绕过此问题,但存在严重安全风险,强烈不推荐;
- 可通过 php artisan tinker 快速验证字段是否可写:StudentMeal::create(['sfa_id' => 1, 'date_served' => now()]);
- 建议配合数据库迁移确认字段存在且非空:$table->unsignedBigInteger('sfa_id'); $table->foreign('sfa_id')->references('id')->on('sfas');
? 补充建议:为提升代码健壮性,可在赋值前增加空值检查:
$sfa = auth()->user()->sfa;
if (!$sfa) {
return back()->withErrors(['sfa_id' => 'Current user does not belong to a valid SFA.']);
}
$tally_meal['sfa_id'] = $sfa->id;
修复后,StudentMeal::create($tally_meal) 将正确插入 sfa_id,SQL 错误即刻消失。











