如何在Laravel控制器中通过foreach编辑数据库JSON字段数据
Laravel 修改JSON字段中指定项的quantity值
现存问题
你当前的代码有几个明显问题:
- 变量
$tid未定义,直接运行会报错,得替换成查询Tasks记录的正确条件(比如对应Tasks表的id参数) - 仅在内存中修改了数组元素,没有将更新后的JSON数据存回数据库,修改不会生效
$task->componente_id是数据库存储的JSON字符串,需要先解码为数组才能修改,修改后还要重新编码回JSON格式
修正后的控制器代码
public function UpdateCantidadEdit($taskId, $serviciosId, $quantity) { // 根据Tasks的id查询目标记录 $tasks = Tasks::where('id', $taskId)->get(); foreach ($tasks as $task) { // 将JSON字段解码为关联数组 $components = json_decode($task->componente_id, true); // 遍历数组时使用引用&,确保修改的是原数组元素 foreach ($components as &$item) { if ($item['servicios'] == $serviciosId) { $item['quantity'] = $quantity; break; } } // 将修改后的数组重新编码为JSON,保存回数据库 $task->componente_id = json_encode($components); $task->save(); } }
关键说明
- JSON字段处理:数据库里的JSON字段是字符串格式,必须用
json_decode($value, true)转成关联数组才能修改,修改完成后用json_encode()转回字符串再保存 - 数组引用:遍历数组时加
&符号,这样修改$item才会直接作用于原数组,否则只是修改临时副本 - 路由参数调整:原方法参数只传了
$id和$quantity,但实际需要Tasks的id、目标servicios的id、新quantity三个参数,所以路由要对应修改,示例如下:
Route::put('/tasks/{taskId}/update-quantity/{serviciosId}/{quantity}', [你的控制器类名::class, 'UpdateCantidadEdit']);
内容的提问来源于stack exchange,提问作者JL DIAZ
相关产品推荐
相关产品推荐

