PHP实现多审批人审核后更新applicationform表状态的方法
实现方案
方案1:单SQL语句直接更新(推荐,性能高且原子性好)
直接在SQL层做统计判断,不需要PHP额外处理业务逻辑,天然原子性,适合多用户同时操作的高并发场景:
UPDATE applicationform af INNER JOIN ( SELECT apply_id, COUNT(*) as agree_count FROM applicationform WHERE apply_id = ? AND agree = 1 GROUP BY apply_id ) cnt ON af.apply_id = cnt.apply_id SET af.status = CASE WHEN cnt.agree_count >=4 THEN 'APPROVED' WHEN cnt.agree_count BETWEEN 1 AND 3 THEN 'DISAPPROVED' ELSE af.status END WHERE af.apply_id = ?;
语句中?占位符替换为当前要更新的申请ID即可。
方案2:PHP先统计再更新(逻辑更直观,便于自定义扩展)
步骤1:查询当前申请的同意人数
// 假设$pdo为已初始化的PDO数据库连接实例 $applyId = 123; // 替换为实际业务中的申请ID $stmt = $pdo->prepare("SELECT COUNT(*) as agree_count FROM applicationform WHERE apply_id = ? AND agree = 1"); $stmt->execute([$applyId]); $agreeCount = $stmt->fetchColumn();
步骤2:根据统计结果更新状态
if ($agreeCount >= 4) { $status = 'APPROVED'; } elseif ($agreeCount >=1 && $agreeCount <=3) { $status = 'DISAPPROVED'; } else { // 0人同意的情况可根据业务需要决定是否更新,这里默认不修改原有状态 return; } // 加行锁避免并发修改冲突 $pdo->beginTransaction(); try { $stmt = $pdo->prepare("UPDATE applicationform SET status = ? WHERE apply_id = ? FOR UPDATE"); $stmt->execute([$status, $applyId]); $pdo->commit(); } catch (Exception $e) { $pdo->rollBack(); throw $e; }
并发场景注意事项
- 6名用户同时操作时一定要加锁,要么用事务+行锁,要么用乐观锁(新增version字段做版本判断),避免统计和更新的间隙被其他请求修改数据,导致状态计算错误
- 建议每一名审批人提交审批结果之后就触发一次状态更新逻辑,不需要等所有用户提交完再处理
内容的提问来源于stack exchange,提问作者dil
相关产品推荐
相关产品推荐

