Laravel Livewire更新JSON列嵌套数组无法保存到数据库怎么办
问题根源
你写的$this->resume->update(['skills.en' => $items])不生效,核心原因是Eloquent的批量赋值(update/create这类方法)只会识别模型$fillable/$guarded配置里的顶层字段,skills.en这种带点的嵌套JSON键会被直接当成非法字段过滤,根本不会执行到数据库写入逻辑。
另外要先确保模型配置了正确的类型转换,不然JSON字段读写都会出问题。
修复步骤
- 先确认
Resume模型配置了skills字段的数组类型转换,自动完成JSON和PHP数组的双向转换:// app/Models/Resume.php protected $casts = [ 'skills' => 'array', // 其他字段转换... ]; - 修改Livewire组件的
save方法,不要用嵌套键走批量更新,直接修改模型实例属性后调用save()即可:public function save() { $this->validate(); // 兜底处理,避免字段为空时取数组下标报错 $skills = $this->resume->skills ?? []; $skills['en'] = $skills['en'] ?? []; // 追加新的技能项 $skills['en'][] = $this->en; // 赋值给模型属性 $this->resume->skills = $skills; // 保存 $this->resume->save(); // 可选:保存完成后清空输入框 $this->en = ''; }
如果你非要用JSON字段的点语法更新,不要走模型实例的批量update方法,改用查询构造器直接写库,这种方式会生成JSON_SET原生SQL执行,不会走批量赋值过滤:
\DB::table('resumes') ->where('id', $this->resume->id) ->update(['skills->en' => $items]);
这种写法不会触发模型事件,也不会走模型的cast转换,非必要不推荐用。
内容的提问来源于stack exchange,提问作者Mehdi Yaghoubi
相关产品推荐
相关产品推荐

