你们怎么判断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条件来起到乐观锁的目的了,你们有啥好的办法没

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 12

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

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


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

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

3年前 评论
Imuyu 3年前

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

3年前 评论

没有维护updated_at字段?

3年前 评论

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

3年前 评论
颠倒的玉石

可以加个事务 :joy:

3年前 评论

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

3年前 评论

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

3年前 评论
ouer1994 3年前

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

3年前 评论

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

3年前 评论

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

3年前 评论

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