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

Laravel如何正确更新数据表JSON列并追加新键值对

问题原因

array_push的作用是向数组末尾追加元素,传入数组类型参数时会把整个数组作为单个元素追加,自动分配数字索引,这就是新增内容被包裹在"0"键下的原因。另外你的代码存在变量名拼写错误:$old_tyoys应为$old_toys。

正确实现代码

你需要合并两个关联数组的键值对,而非追加元素,两种实现方式可按需选择:

方式1:数组合并运算符(追加场景推荐)

该方式遇到同名键时会保留原有数组的值,不会覆盖已有的玩具数据,完全匹配你当前追加新玩具的需求:

$new_toys = [
   'animals'  => ['qty' => 1, 'price' => 4],
   'stickers' => ['qty' => 12, 'price' => 12]
];
$old_toys = $account->toys;
$account->toys = $old_toys + $new_toys;
$account->save();

方式2:array_merge函数(需更新已有数据时适用)

该方式遇到同名键时会用新数组的值覆盖旧值,如果后续需要修改已有玩具的库存、价格可以使用这个写法:

$new_toys = [
   'animals'  => ['qty' => 1, 'price' => 4],
   'stickers' => ['qty' => 12, 'price' => 12]
];
$old_toys = $account->toys;
$account->toys = array_merge($old_toys, $new_toys);
$account->save();
前置注意事项

如果你的Account模型没有配置字段类型转换,$account->toys取出来会是JSON字符串而非数组,无法直接做数组合并操作,需要提前在模型中添加如下配置:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Account extends Model
{
    // 新增该配置,自动完成JSON和数组的互转
    protected $casts = [
        'toys' => 'array',
    ];
}

执行上述代码后,得到的JSON结构会和预期完全一致,animals、stickers会直接作为一级键存在。

内容的提问来源于stack exchange,提问作者Rich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:18:20