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
相关产品推荐
相关产品推荐

