Laravel删除视频积分扣除异常:预期扣1分却现多种扣除值,求原因
问题分析与解决方案
嘿,我一眼就看出问题所在了——你的积分扣除逻辑完全跑偏了,不是扣当前删除的1个视频对应的1积分,而是直接扣了该用户所有视频的总数,这就是为什么积分减少的数值每次都不一样(3、1、4这些数其实就是该用户当前拥有的视频总数)。
具体问题拆解
咱们来一步步捋你的代码逻辑:
- 你写的子查询
$query是按creator_id分组,统计每个创作者的全部视频数量,比如某个用户有3个视频,这个子查询返回的count就是3。 - 接着你把这个子查询和
users表关联,执行更新时用my_points - count,这就相当于直接把该用户的积分减去他所有视频的总数,而不是预期的1。 - 最后才删除单个视频,这时候积分已经被扣多了,而且每次删除操作都会重复这个错误逻辑。
正确的实现方式
你需要针对当前要删除的这个视频的创作者,单独扣除1积分,不需要统计他的所有视频。代码可以改成这样:
// 先获取当前视频的创作者ID $creatorId = $video->creator_id; // 给该创作者扣除1积分 DB::table('users') ->where('id', $creatorId) ->update(['my_points' => DB::raw('my_points - 1')]); // 执行视频删除 $video->delete(); return redirect('/videos')->with('alert-success', 'Video deleted');
额外优化:处理并发场景
如果担心出现并发操作(比如用户同时删除多个视频)导致积分扣除异常,可以用数据库事务包裹操作,确保积分扣除和视频删除要么都成功,要么都回滚:
DB::transaction(function () use ($video) { $creatorId = $video->creator_id; DB::table('users') ->where('id', $creatorId) ->update(['my_points' => DB::raw('my_points - 1')]); $video->delete(); }); return redirect('/videos')->with('alert-success', 'Video deleted');
内容的提问来源于stack exchange,提问作者ром Макаров
相关产品推荐
相关产品推荐

