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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:24:17