You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Livewire更新JSON列嵌套数组无法保存到数据库怎么办

问题根源

你写的$this->resume->update(['skills.en' => $items])不生效,核心原因是Eloquent的批量赋值(update/create这类方法)只会识别模型$fillable/$guarded配置里的顶层字段,skills.en这种带点的嵌套JSON键会被直接当成非法字段过滤,根本不会执行到数据库写入逻辑。
另外要先确保模型配置了正确的类型转换,不然JSON字段读写都会出问题。

修复步骤
  1. 先确认Resume模型配置了skills字段的数组类型转换,自动完成JSON和PHP数组的双向转换:
    // app/Models/Resume.php
    protected $casts = [
        'skills' => 'array',
        // 其他字段转换...
    ];
    
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:48:36