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
相关产品推荐
相关产品推荐

