通过User模型自定义方法编辑用户时addBalance余额增加方法失效问题
问题核心原因
你编写的方法仅修改了内存中当前User模型实例的balance属性值,没有将修改结果持久化写入数据库,因此查询数据库时数值不会发生变化,看起来就像方法未生效。
两种可行修复方案
方案1:修改后手动触发保存
public function addBalance($balance) { $this->balance += $balance; // 执行save方法将修改写入数据库 $saveResult = $this->save(); // 保存成功返回最新余额,失败返回false便于上层判断 return $saveResult ? $this->balance : false; }
适用场景:需要触发模型的saving、saved等事件,或者要同时修改其他模型字段的场景。
方案2:使用数据库原子增量操作(更推荐库存场景使用)
public function addBalance($balance) { // 直接执行数据库层面的原子增量,避免并发竞态问题 return $this->increment('balance', $balance); }
优势:
- 原子操作,高并发场景下不会出现库存计算错误
- 不需要先查询再写入,性能更高
- 自动完成数据库写入,不需要额外调用
save
注意事项
- 库存变更属于敏感操作,建议搭配数据库事务使用,避免异常导致数据不一致
- 不要使用「先查库存->本地计算->写入数据库」的非原子逻辑,高并发下一定会出现数据错误
- 如果要做库存下限校验,可以给
increment加条件,或者结合事务做行锁处理
内容的提问来源于stack exchange,提问作者Awminux
相关产品推荐
相关产品推荐

