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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 18:15:04