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

Laravel删除视频积分扣除异常:预期扣1分却现多种扣除值,求原因

问题分析与解决方案

嘿,我一眼就看出问题所在了——你的积分扣除逻辑完全跑偏了,不是扣当前删除的1个视频对应的1积分,而是直接扣了该用户所有视频的总数,这就是为什么积分减少的数值每次都不一样(3、1、4这些数其实就是该用户当前拥有的视频总数)。

具体问题拆解

咱们来一步步捋你的代码逻辑:

  1. 你写的子查询$query是按creator_id分组,统计每个创作者的全部视频数量,比如某个用户有3个视频,这个子查询返回的count就是3。
  2. 接着你把这个子查询和users表关联,执行更新时用my_points - count,这就相当于直接把该用户的积分减去他所有视频的总数,而不是预期的1。
  3. 最后才删除单个视频,这时候积分已经被扣多了,而且每次删除操作都会重复这个错误逻辑。

正确的实现方式

你需要针对当前要删除的这个视频的创作者,单独扣除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,提问作者ром Макаров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:09:23