
当 Laravel 模型的 $fillable 数组未包含 sfa_id 字段时,即使在控制器中显式赋值,Eloquent 仍会忽略该字段,导致插入失败并抛出“Field doesn't have a default value”错误。
当 laravel 模型的 `$fillable` 数组未包含 `sfa_id` 字段时,即使在控制器中显式赋值,eloquent 仍会忽略该字段,导致插入失败并抛出“field doesn't have a default value”错误。
该问题的根本原因在于 Laravel 的批量赋值(Mass Assignment)保护机制。StudentMeal::create($tally_meal) 方法仅允许 $fillable 数组中声明的字段被批量写入数据库。尽管你在 $tally_meal 数组中正确设置了 'sfa_id' => auth()->user()->sfa->id,但如果 StudentMeal 模型未将 sfa_id 列入可填充字段,Eloquent 就会在构造插入语句时直接剔除该键——这正是 SQL 错误 Field 'sfa_id' doesn't have a default value 的根源(数据库要求该字段非空,但实际未传值)。
✅ 解决步骤:
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- 打开 app/Models/StudentMeal.php(或对应路径下的模型文件);
- 定位 $fillable 属性(通常位于模型类顶部);
- 确保 sfa_id 已加入数组中:
protected $fillable = [
'date_served',
'meal_type_id',
'tally',
'site_id',
'user_id',
'sfa_id', // ← 关键:必须显式添加
];
⚠️ 注意事项:
- 若使用 $guarded = ['*'](全封闭模式),则需改为 $fillable 白名单方式,或移除 $guarded 并明确列出所有允许字段;
- 不要为绕过保护而临时使用 StudentMeal::unguard(),这会带来安全风险;
- 建议同步检查数据库表结构:确认 student_meals.sfa_id 字段类型为 BIGINT UNSIGNED(对应 Laravel 的 foreignId()),且无 NOT NULL 约束缺失(即确实需要值,而非依赖默认值);
- 可通过 dd($tally_meal) 在 storeTally() 中验证 sfa_id 是否已正确注入数组,排除上游逻辑问题。
修复后,create() 将正常接收并持久化 sfa_id,SQL 插入语句也将包含该字段,错误彻底消除。










