balance()->lockForUpdate()->first(); if (is_null($balance)) { throw new BalanceNotEnoughException(); } // 变更前余额 $beforeBalance = $balance->balance; $_changeBalance = abs($changeBalance); if ($changeBalance > 0) { // 收入 $user->balance()->update([ 'balance' => DB::raw("balance + {$_changeBalance}"), 'total_revenue' => DB::raw("total_revenue + {$_changeBalance}"), ]); } else { // 支出 if ($balance->balance < $_changeBalance) { throw new BalanceNotEnoughException(); } $user->balance()->update([ 'balance' => DB::raw("balance - {$_changeBalance}"), 'total_expenses' => DB::raw("total_expenses + {$_changeBalance}"), ]); } $user->balanceLogs()->create([ 'loggable_id' => $loggable?->id, 'loggable_type' => $loggable?->getMorphClass(), 'before_balance' => $beforeBalance, 'change_balance' => $changeBalance, 'action' => $action, 'remarks' => $remarks, ]); } }