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

Laravel中如何同时更新JSON列与其他数据列?

在Laravel中同时更新普通列与JSON列的方法

没问题,我来帮你搞定Laravel里同时更新普通字段和JSON字段的需求!你可以通过两种常用方式实现,我会结合你现有的代码给出具体示例:

方法一:通过模型实例操作(推荐,会触发模型事件)

这种方式适配你当前的代码结构,而且Laravel会自动帮你处理JSON与数组的转换——前提是你需要在Order模型里配置$casts属性,让product_name自动转成数组:

// app/Models/Order.php
class Order extends Model
{
    protected $casts = [
        'product_name' => 'array', // 关键配置,自动把JSON转成数组
    ];
}

然后修改你的update方法,在更新普通字段的同时,修改JSON列里的商品数量:

public function update(Request $request, $id) {
    $this->validate($request, array(
        'payment_id'=>'nullable',
        'orderstatus_id' => 'required|numeric',
        'address_id' => 'required|numeric',
        // 如果前端传递了指定商品的数量参数,比如quantity_29,这里可以加验证规则
        'quantity_29' => 'nullable|numeric|min:1'
    ));

    // 用findOrFail替代find,避免找不到订单时出错
    $order = Order::findOrFail($id);
    
    // 更新普通字段
    $order->payment_id = $request->input('payment_id');
    $order->orderstatus_id = $request->input('orderstatus_id');
    $order->address_id = $request->input('address_id');

    // 更新JSON列中的指定商品quantity
    if ($request->has('quantity_29')) {
        // 因为配置了$casts,$order->product_name直接是数组
        $products = $order->product_name;
        // 检查该商品是否存在
        if (isset($products['29'])) {
            $products['29']['quantity'] = $request->input('quantity_29');
            $order->product_name = $products;
        }
    }

    $order->save();

    return redirect()->route('orders.index', $order->id)->with('success', 'Order updated successfully.');
}

如果需要同时修改多个商品的数量,你可以让前端传递一个数组参数(比如quantities,格式为['29' => 5, '37' => 3]),然后循环处理:

if ($request->has('quantities')) {
    $products = $order->product_name;
    foreach ($request->input('quantities') as $productId => $quantity) {
        if (isset($products[$productId])) {
            $products[$productId]['quantity'] = $quantity;
        }
    }
    $order->product_name = $products;
}

方法二:使用查询构造器(更高效,不触发模型事件)

如果你不需要触发模型的saving/saved等事件,可以直接用查询构造器,把普通字段和JSON字段的更新放在同一个update方法里,就像你在官网看到的单独更新JSON的方式扩展一下:

public function update(Request $request, $id) {
    $this->validate($request, array(
        'payment_id'=>'nullable',
        'orderstatus_id' => 'required|numeric',
        'address_id' => 'required|numeric',
        'quantity_29' => 'nullable|numeric|min:1'
    ));

    // 组装要更新的字段数组
    $updateData = [
        'payment_id' => $request->input('payment_id'),
        'orderstatus_id' => $request->input('orderstatus_id'),
        'address_id' => $request->input('address_id'),
    ];

    // 添加JSON字段的更新(如果有传递数量参数)
    if ($request->has('quantity_29')) {
        // 用箭头语法直接定位JSON路径
        $updateData['product_name->29->quantity'] = $request->input('quantity_29');
    }

    // 执行批量更新
    Order::where('id', $id)->update($updateData);

    $order = Order::find($id);
    return redirect()->route('orders.index', $order->id)->with('success', 'Order updated successfully.');
}

这种方式直接生成一条SQL语句,性能更好,但不会触发模型的任何事件,适合不需要额外逻辑的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:07:47