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

如何为Salesforce的Job_Application__c对象创建两个触发器,实现Review__c记录自动创建与面试官字段同步更新

解决Job Application面试官字段同步到对应Review记录的问题

没问题,我来帮你搞定这个同步需求,其实同一对象上多个触发器是完全可行的,不过咱们可以选择更清晰的实现方式,先理清楚你的两个核心需求:

  1. 新增Job_Application__c时自动创建关联的Review__c,同时把Interviewer__c字段传过去
  2. 当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:07:28