Laravel表单请求金额扣除及Accounts表更新问题求助
修正后的转账扣款代码及问题说明
先列下你原代码里的几个关键问题:
- 字段拼写不一致:验证规则里是
trans_amou,但判断和赋值时写成了trans_amoun,导致拿不到正确的转账金额 - 余额获取错误:
pluck('amount')会取出所有账户的金额集合,不是当前用户的单个余额,没法直接和转账金额比较 - 余额判断逻辑搞反了:应该是转账金额大于余额时提示余额不足,你写的条件刚好相反
- 变量赋值完全错误:
$request->trans_amoun = $trans_amoun这种写法毫无意义,而且没加分号;计算新余额的逻辑也错了 - 更新语句语法错误:Laravel的
update()方法需要传键值对数组,你直接传字段名根本不生效 - 缺少事务处理:转账属于敏感操作,必须用事务保证数据一致性,避免中途出错导致余额异常
下面是修正后的完整代码:
public function transferSend(Request $request) { // 完善验证规则,加上金额的数值验证 $request->validate([ 'rec_acc_name' => 'required', 'swift_code' => 'required', 'rou_no' => 'required', 'rec_bank_add' => 'required', 'trans_amou' => 'required|numeric|min:0.01', // 确保是有效金额 'remarks' => 'required', ]); // 获取当前登录用户的账户余额(假设accounts表有user_id关联用户) $account = DB::table('accounts')->where('user_id', auth()->id())->first(); // 先判断账户是否存在 if (!$account) { return redirect()->back()->withErrors('账户不存在'); } $transferAmount = $request->trans_amou; $currentBalance = $account->amount; // 正确的余额判断逻辑:转账金额大于当前余额时提示不足 if ($transferAmount > $currentBalance) { return redirect()->back()->withErrors('余额不足,无法完成转账'); } // 开启事务,保证操作原子性 DB::beginTransaction(); try { // 计算新余额并更新账户 $newBalance = $currentBalance - $transferAmount; DB::table('accounts') ->where('user_id', auth()->id()) ->update(['amount' => $newBalance]); // 如果需要记录转账日志,可以在这里添加代码,比如插入到transactions表 // DB::table('transactions')->insert([...]); // 提交事务 DB::commit(); // 转账成功后的响应,比如重定向回表单并提示成功 return redirect()->back()->with('success', '转账扣款成功'); } catch (\Exception $e) { // 出错则回滚事务 DB::rollBack(); return redirect()->back()->withErrors('转账失败,请稍后重试'); } }
补充说明:
- 假设你的
accounts表有user_id字段关联登录用户,如果你的账户关联逻辑不同,需要修改where条件来定位要扣款的账户 - 加入了事务处理,防止中途出现错误导致余额数据混乱
- 完善了验证规则,避免用户输入非数字或负数金额
- 用
redirect()->back()->withErrors()和with('success')来给前端返回提示信息,符合Laravel的常规做法
内容的提问来源于stack exchange,提问作者cruz stenburg
相关产品推荐
相关产品推荐

