你们怎么判断Laravel的Update是否成功

$amount = $user->amount + $cash;
                $result = User::where('id', $user->id)->where('amount', $user->amount)->update(['amount' => $amount]);
                if(!$result) {
                    throw new InvalidRequestException('修改真实金额失败,请刷新重试');
                }

这个代码有一个坑,就是我是通过判断$result来决定更新是否成功的,但是这样有一个问题,一旦更新的数据和原本是一样的,返回也是0,这样就起不到我想通过加where条件来起到乐观锁的目的了,你们有啥好的办法没

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 12

没有维护updated_at字段?

1周前 评论

很少判断更新或者插入是否成功,真的,大多数laravel开发者都是这样。

根据你的业务逻辑来说,流程应该是这样


if($cash !== 0){
    $user->amount =+ $cash;
    $user->save();
}

因为在累加的情况下,我实在是想不到除了 cash 是0以外,为什么会有一旦更新的数据和原本是一样的的情况

1周前 评论
Imuyu 1周前

数据如果是一样的,那么前端就应该做拦截处理,而不是请求接口。

1周前 评论

面向对象编程User::where()->update()返回的是影响行数,$user->save() 返回的是是否执行成功!

1周前 评论

你这个代码写的没毛病, 你再加一个 当前要更新去的金额和数据库里的金额是否一直的判断就可以了啊, 其实就是判断 $cash 是否为 0, 为 0 的话根本都不用走更新数据库的逻辑

1周前 评论

你这并不是单纯+0 的问题,并发情况下加事物

1周前 评论
ouer1994 1周前

和事务没关系,就是+0的问题导致update返回为0 我这个是实现乐观锁,更新之前判断$cash是否为0目前是比较中意的方案

1周前 评论

为啥要判断?更新了肯定会成功,不成功框架自然会抛出异常。你要做的是处理那部分异常怎么显示更友好而已。

1周前 评论

@jhazusj 需要回滚其它SQL执行,比如说添加财务日志这样的

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!