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

Laravel中使用json_encode/decode给JSON字段追加数据时数组变整数问题

问题原因

问题出在array_push的返回值特性上:array_push函数返回的是追加元素后数组的总长度,而非修改后的数组本身。你把这个返回值(整数2)赋值给了$file_history,最后通过json_encode转换后,自然就变成了字符串"2"存入数据库。

修复方案

方案1:正确使用array_push

不要将array_push的返回值赋值给原变量,直接调用函数修改数组:

public function update(Request $request, String $uuid)
{
    $file = File::find($uuid);

    $json_data = [
        "updated_at" => Carbon::now()
    ];

    $file_history = json_decode($file->file_history, true);
    // 直接调用array_push,不接收返回值
    array_push($file_history, $json_data);

    $file->file_history = json_encode($file_history);
    // 优先保存手动修改的字段,避免request数据覆盖
    $file->save();
    return $file;
}

方案2:使用PHP数组追加语法(更简洁)

直接用[]语法向数组末尾追加元素,可读性更强:

public function update(Request $request, String $uuid)
{
    $file = File::find($uuid);

    $file_history = json_decode($file->file_history, true);
    // 直接追加元素到数组
    $file_history[] = [
        "updated_at" => Carbon::now()
    ];

    $file->file_history = json_encode($file_history);
    $file->save();
    return $file;
}
进阶优化:利用Laravel的字段自动转换

在File模型中配置$casts属性,让Laravel自动处理JSON与数组的转换,无需手动调用json_decode和json_encode:

class File extends Model
{
    protected $casts = [
        'file_history' => 'array',
    ];
}

之后代码可以简化为:

public function update(Request $request, String $uuid)
{
    $file = File::find($uuid);

    // 直接操作数组,Laravel会自动转为JSON存入数据库
    $file->file_history[] = [
        "updated_at" => Carbon::now()
    ];

    $file->update($request->all());
    return $file;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:15:36