Laravel中如何向JSON数组字段添加新值(避免覆盖原有数据)
问题描述
在Laravel控制器中编写了创建Rumah数据并同步更新User表中JSON数组字段lihatAlamat和editAlamat的代码,但当前逻辑会直接覆盖原有数组,而非追加新ID。
当前代码
$rumah = Rumah::create($validatedData); $updateData = [ 'lihatAlamat' => json_encode($rumah->id), 'editAlamat' => json_encode($rumah->id) ]; auth()->user()->update($updateData); return redirect('/rumah');
问题现象
原有User表字段值:
lihatAlamat = ["1","2"]
editAlamat = ["1","2"]
创建新Rumah数据(ID为3)后,字段被覆盖为:
lihatAlamat = 3
editAlamat = 3
需要实现向这两个JSON数组字段中追加新ID,而非覆盖原有数组。
解决方案
要实现追加新ID,需要先读取用户当前的数组值,合并新ID后再重新编码为JSON:
基础实现代码
$rumah = Rumah::create($validatedData); $user = auth()->user(); // 读取现有数组,字段为空时初始化空数组 $lihatAlamat = json_decode($user->lihatAlamat, true) ?? []; $editAlamat = json_decode($user->editAlamat, true) ?? []; // 追加新ID(先判断是否已存在,避免重复) if (!in_array($rumah->id, $lihatAlamat)) { $lihatAlamat[] = $rumah->id; } if (!in_array($rumah->id, $editAlamat)) { $editAlamat[] = $rumah->id; } // 更新用户字段 $user->update([ 'lihatAlamat' => json_encode($lihatAlamat), 'editAlamat' => json_encode($editAlamat) ]); return redirect('/rumah');
代码说明
- 读取现有数组:用
json_decode(..., true)将JSON字符串转为PHP数组,?? []确保字段为空时不会报错,直接初始化为空数组。 - 避免重复:通过
in_array()检查新ID是否已存在,防止同一ID被多次添加。 - 重新编码更新:把合并后的数组转回JSON字符串,再执行更新操作,实现追加效果。
Laravel 9+ 进阶优化
如果你的Laravel版本是9及以上,可以利用模型的JSON字段类型转换,省去手动编码解码的步骤:
- 在
User模型中添加类型转换定义:
protected $casts = [ 'lihatAlamat' => 'array', 'editAlamat' => 'array', ];
- 控制器中简化代码:
$rumah = Rumah::create($validatedData); $user = auth()->user(); // 直接操作数组 if (!in_array($rumah->id, $user->lihatAlamat)) { $user->lihatAlamat[] = $rumah->id; } if (!in_array($rumah->id, $user->editAlamat)) { $user->editAlamat[] = $rumah->id; } $user->save(); return redirect('/rumah');
这种方式下Laravel会自动处理JSON和PHP数组之间的转换,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Muhammad Trian Syahputra
相关产品推荐
相关产品推荐

