
当 Laravel 的 StudentMeal::create() 方法未将 sfa_id 写入数据库并报错“Field 'sfa_id' doesn't have a default value”时,根本原因通常是该字段未被列入模型的 $fillable 数组,导致批量赋值(mass assignment)被拒绝。
当 laravel 的 `studentmeal::create()` 方法未将 `sfa_id` 写入数据库并报错“field 'sfa_id' doesn't have a default value”时,根本原因通常是该字段未被列入模型的 `$fillable` 数组,导致批量赋值(mass assignment)被拒绝。
在你提供的 storeTally() 方法中,虽然已显式为 $tally_meal['sfa_id'] 赋值:
$tally_meal['sfa_id'] = auth()->user()->sfa->id;
且该值确实存在于 $tally_meal 数组中,但 Laravel 的 Eloquent create() 方法仅允许写入 $fillable(白名单)中声明的字段。若 sfa_id 不在 StudentMeal 模型的 $fillable 数组里,Eloquent 会静默忽略该字段——既不报错,也不插入,最终导致数据库因该字段非空且无默认值而抛出 SQL 错误 HY000: 1364。
✅ 正确做法:打开 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 = [](全开放)代替 $fillable,这会带来严重的批量赋值安全风险;
- 若模型启用了严格模式($strict = true)或数据库字段设置了 NOT NULL 且无默认值,缺失 $fillable 声明将直接导致插入失败;
- 可通过 dd($tally_meal) 在 create() 前验证数组是否包含 sfa_id,排除逻辑赋值问题;
- 推荐在开发阶段启用 Laravel 的 Mass Assignment Exception 提示(确保 APP_DEBUG=true),便于快速定位类似问题。
? 补充建议:为提升健壮性,可在赋值前增加空值校验:
$sfa = auth()->user()->sfa;
if (!$sfa) {
return back()->withErrors(['sfa_id' => '当前用户未关联有效的 SFA 记录。']);
}
$tally_meal['sfa_id'] = $sfa->id;
至此,sfa_id 将被正确写入数据库,SQL 报错彻底解决。











