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

