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

PHP中如何检测作业(Job)及其关联原因(Reason)的增删改变化并追踪操作轨迹

检测作业与关联原因的全量变更方案

咱们可以通过对比数据库原有状态和表单提交数据的方式,拆解出所有变更类型,包括新增作业、删除作业、已有作业的原因增减,同时可以清晰记录操作行为。下面用PHP代码来实现这个逻辑,完全贴合你给出的数据结构:

1. 先定义核心数据变量

首先把你提到的两类数据整理成更易处理的结构:

// 数据库原有状态:键是job_id,值是关联的reason_id数组
$originalJobs = [
    1 => [3, 4],
    3 => [11]
];

// 表单提交的作业ID数组
$submittedJobIds = [1, 3];

// 表单提交的作业关联原因:整理成键为job_id的数组(替代你提到的ids_reasons_1、ids_reasons_3)
$submittedReasons = [
    1 => [3, 4],
    3 => [11]
];

注:如果表单提交的原因是通过ids_reasons_{job_id}这种命名传递的,可以用循环把它们整理成$submittedReasons数组,比如遍历$submittedJobIds,动态获取对应的原因数组。

2. 逐个检测变更类型

(1)检测新增的作业

提交的作业ID不在原有数据库键中的,就是新增作业:

$originalJobIds = array_keys($originalJobs);
$addedJobs = array_diff($submittedJobIds, $originalJobIds);

// 输出示例:如果提交了job_id=5,这里会得到[5]
foreach ($addedJobs as $jobId) {
    echo "操作:新增作业,ID:$jobId,关联原因:" . implode(', ', $submittedReasons[$jobId] ?? []) . "\n";
}

(2)检测删除的作业

原有数据库中的作业ID不在提交列表中的,就是被删除的作业:

$deletedJobs = array_diff($originalJobIds, $submittedJobIds);

// 输出示例:如果原有job_id=2不在提交列表,这里会得到[2]
foreach ($deletedJobs as $jobId) {
    echo "操作:删除作业,ID:$jobId,原关联原因:" . implode(', ', $originalJobs[$jobId]) . "\n";
}

(3)检测已有作业的原因变更

对同时存在于原有数据和提交数据中的作业,对比两边的原因数组,找出新增和删除的原因:

// 找出两边都存在的作业ID
$existingJobIds = array_intersect($originalJobIds, $submittedJobIds);

foreach ($existingJobIds as $jobId) {
    $originalReasons = $originalJobs[$jobId];
    $submittedReasonsForJob = $submittedReasons[$jobId] ?? [];

    // 新增的原因:提交的原因不在原有列表中
    $addedReasons = array_diff($submittedReasonsForJob, $originalReasons);
    if (!empty($addedReasons)) {
        echo "操作:为作业ID $jobId 新增原因,ID:" . implode(', ', $addedReasons) . "\n";
    }

    // 删除的原因:原有原因不在提交列表中
    $deletedReasons = array_diff($originalReasons, $submittedReasonsForJob);
    if (!empty($deletedReasons)) {
        echo "操作:从作业ID $jobId 移除原因,ID:" . implode(', ', $deletedReasons) . "\n";
    }
}

3. 整合操作日志

把上面的检测结果整合起来,就能得到完整的操作行为记录,方便后续追踪操作人。比如可以把这些日志存到数据库的操作记录表中,包含操作人ID、操作类型、关联ID等字段。

关键逻辑说明

  • 用array_keys获取原有作业的ID列表,方便集合对比
  • array_diff用来找出两个数组的差异(存在于A但不存在于B的元素)
  • array_intersect用来找出同时存在于两个数组的元素,也就是需要检查原因变更的作业
  • 处理表单提交的原因时,要注意作业可能没有关联任何原因(非必填),所以要用?? []来避免报错

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:13:11