Laravel 8 Eloquent执行create操作生成SQL查询缺失字段问题
问题根因
该报错由Laravel Eloquent的批量赋值过滤机制触发:
create()属于批量赋值操作,所有传入的字段必须提前在模型的$fillable白名单中声明,未声明的字段会被自动过滤,不会写入生成的SQL语句中。- 你另外两个可正常运行的Pivot模型必然已经配置了对应字段的
$fillable属性,可以直接对比校验。
修复方案
打开MovieGenre Pivot模型文件,添加$fillable属性声明允许批量赋值的字段即可:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Relations\Pivot; class MovieGenre extends Pivot { // 新增以下代码 protected $fillable = [ 'movie_id', 'genre_id', ]; }
可选优化
你当前先删除旧关联、再循环创建新关联的逻辑,可以直接用Laravel多对多关联自带的sync()方法简化,无需手动操作中间表模型:
// 前提是Movie模型中已经定义了genres的belongsToMany关联 $movie = Movie::findOrFail($id); $movie->genres()->sync($request->input('genres', []));
sync()方法会自动完成旧关联删除、新关联创建的全流程,也天然规避了中间表模型的批量赋值问题。
内容的提问来源于stack exchange,提问作者Jakub Krakowiak
相关产品推荐
相关产品推荐

