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

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');

代码说明

  1. 读取现有数组:用json_decode(..., true)将JSON字符串转为PHP数组,?? []确保字段为空时不会报错,直接初始化为空数组。
  2. 避免重复:通过in_array()检查新ID是否已存在,防止同一ID被多次添加。
  3. 重新编码更新:把合并后的数组转回JSON字符串,再执行更新操作,实现追加效果。

Laravel 9+ 进阶优化

如果你的Laravel版本是9及以上,可以利用模型的JSON字段类型转换,省去手动编码解码的步骤:

  1. 在User模型中添加类型转换定义:
protected $casts = [
    'lihatAlamat' => 'array',
    'editAlamat' => 'array',
];
  1. 控制器中简化代码:
$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:45:02