如何为Salesforce的Job_Application__c对象创建两个触发器,实现Review__c记录自动创建与面试官字段同步更新
解决Job Application面试官字段同步到对应Review记录的问题
没问题,我来帮你搞定这个同步需求,其实同一对象上多个触发器是完全可行的,不过咱们可以选择更清晰的实现方式,先理清楚你的两个核心需求:
- 新增
Job_Application__c时自动创建关联的Review__c,同时把Interviewer__c字段传过去 - 当
Job_Application__c的Interviewer__c字段修改后,自动同步到对应的Review__c记录里
给你两种实现方案,你可以根据自己的习惯选择:
方案1:把逻辑合并到同一个触发器里(更推荐)
这种方式把插入和更新的逻辑放在一起,维护起来更方便,不用切换多个触发器文件:
trigger JobApplicationTrigger on Job_Application__c (after insert, after update) { if (Trigger.isAfter) { List<Review__c> reviewRecords = new List<Review__c>(); if (Trigger.isInsert) { // 新增Job Application时创建Review记录 for(Job_Application__c jobApp : Trigger.new) { Review__c newRev = new Review__c(); newRev.Interviewer__c = jobApp.Interviewer__c; newRev.Job_Application__c = jobApp.Id; reviewRecords.add(newRev); } if (!reviewRecords.isEmpty()) { insert reviewRecords; } } else if (Trigger.isUpdate) { // 更新Job Application时,同步面试官到关联Review // 先收集面试官字段有变化的Job Application Map<Id, Id> jobAppIdToInterviewerMap = new Map<Id, Id>(); for(Job_Application__c jobApp : Trigger.new) { Job_Application__c oldJobApp = Trigger.oldMap.get(jobApp.Id); // 只有字段真的变了才处理,避免无用操作 if (jobApp.Interviewer__c != oldJobApp.Interviewer__c) { jobAppIdToInterviewerMap.put(jobApp.Id, jobApp.Interviewer__c); } } if (!jobAppIdToInterviewerMap.isEmpty()) { // 查出对应的Review记录 List<Review__c> reviewsToUpdate = [ SELECT Id, Interviewer__c FROM Review__c WHERE Job_Application__c IN :jobAppIdToInterviewerMap.keySet() ]; // 更新面试官字段 for(Review__c rev : reviewsToUpdate) { rev.Interviewer__c = jobAppIdToInterviewerMap.get(rev.Job_Application__c); } if (!reviewsToUpdate.isEmpty()) { update reviewsToUpdate; } } } } }
方案2:分开写两个独立触发器(如果你更习惯拆分逻辑)
Salesforce允许同一对象上存在多个触发器,它们会按照你在设置里指定的顺序执行,完全不用担心冲突:
第一个触发器(负责新增Job Application时创建Review)
trigger JobApplicationInsertTrigger on Job_Application__c (after insert) { if (Trigger.isAfter && Trigger.isInsert) { List<Review__c> reviewList = new List<Review__c>(); for(Job_Application__c jobApp : trigger.new) { Review__c newRev = new Review__c(); newRev.Interviewer__c = jobapp.Interviewer__c; newRev.Job_Application__c = jobApp.Id; reviewList.add(newRev); } if (reviewList.size() > 0) { insert reviewList; } } }
第二个触发器(负责更新Job Application时同步面试官到Review)
trigger JobApplicationUpdateTrigger on Job_Application__c (after update) { if (Trigger.isAfter && Trigger.isUpdate) { Map<Id, Id> jobAppToInterviewerMap = new Map<Id, Id>(); // 筛选出面试官字段有变化的记录 for(Job_Application__c jobApp : Trigger.new) { Job_Application__c oldJobApp = Trigger.oldMap.get(jobApp.Id); if (jobApp.Interviewer__c != oldJobApp.Interviewer__c) { jobAppToInterviewerMap.put(jobApp.Id, jobApp.Interviewer__c); } } if (!jobAppToInterviewerMap.isEmpty()) { // 查询关联的Review记录 List<Review__c> reviews = [ SELECT Id, Job_Application__c FROM Review__c WHERE Job_Application__c IN :jobAppToInterviewerMap.keySet() ]; // 更新面试官字段 for(Review__c rev : reviews) { rev.Interviewer__c = jobAppToInterviewerMap.get(rev.Job_Application__c); } update reviews; } } }
几个关键提醒
- 两种方案都考虑了批量操作,比如一次处理多条Job Application记录,这在Salesforce里是必须的,避免触发单条记录限制。
- 更新逻辑里加了字段变化判断,这样不会每次更新Job Application都跑同步逻辑,节省系统资源。
- 如果你后续还有更多触发器需求,建议了解下Handler触发器框架,把业务逻辑从触发器里抽离出来,代码会更整洁好维护~
内容的提问来源于stack exchange,提问作者Cintra
相关产品推荐
相关产品推荐

