Laravel中如何更新MySQL数据表中的两行数值数据?
Laravel 批量更新钱包明细行实现方案
问题说明
你的钱包详情表(tbl_wallet_detail)里有多条数据,比如两行剩余金额都是1250卢比,总计2500卢比。当用户要把这2500卢比全部用完时,需要同时更新这两行的已用金额和剩余金额。
原代码里用first()只会获取第一行数据,只能更新一行,没法满足需求,下面给你两种可行的实现方式:
方式一:逐行更新(通用场景)
先查出当月所有符合条件的明细行,然后循环扣除金额,直到总使用金额用完:
// 获取当月所有关联的钱包明细 $wallet_details = tbl_wallet_detail::where('wd_parent_id', $usewallet->wm_id) ->whereMonth('wd_start_date', date('m')) ->whereYear('wd_start_date', date('Y')) ->get(); // 用get()取所有行,替换原代码的first() $total_need_use = $request->usewallet; // 用户要使用的总金额,这里是2500卢比 foreach ($wallet_details as $detail) { // 计算当前行能扣的金额:要么扣完剩余,要么扣完剩下的待使用金额 $use_amount = min($detail->wd_remaining_amount, $total_need_use); $detail->wd_used_amount += $use_amount; $detail->wd_remaining_amount -= $use_amount; $detail->save(); // 减去已用的金额,直到总金额用完就停止循环 $total_need_use -= $use_amount; if ($total_need_use <= 0) { break; } }
方式二:批量更新(一次性清空所有剩余金额)
如果确定用户要使用的金额刚好等于所有行剩余金额的总和,直接用批量更新更高效,一步把所有剩余金额转为已用:
use Illuminate\Support\Facades\DB; // 记得引入DB门面 tbl_wallet_detail::where('wd_parent_id', $usewallet->wm_id) ->whereMonth('wd_start_date', date('m')) ->whereYear('wd_start_date', date('Y')) ->update([ 'wd_used_amount' => DB::raw('wd_used_amount + wd_remaining_amount'), 'wd_remaining_amount' => 0 ]);
提示:方式二适合一次性把所有剩余金额都用完的场景,如果用户使用的金额不是总剩余,还是用方式一更稳妥。
内容的提问来源于stack exchange,提问作者swapnil mane
相关产品推荐
相关产品推荐

