Apex触发器 - 连接对象

时间:2017-07-29 15:29:56

标签: salesforce apex apex-trigger

请耐心等待我,因为我是Apex的新手并触发。

我有一个自定义对象,会议。此自定义对象是自定义Junction对象Junction的主要对象。设置Junction对象以允许我显示标准对象联系人的相关列表,从而将联系人与会议相关联。

我正在尝试创建一个Apex触发器,它将在插入后,更新后,删除后以及取消删除通过Junction对象分配给Conference的联系人之后触发。所有触发器需要做的是更新Conferences对象上的一个字段,显示与会议相关联的联系人数量。

我觉得我必须做得比实际需要的更难。我正在努力完成这项任务的数据建模 - 我假设我的触发器需要在Junction对象上,因为那就是Contacts的数量,所以我假设我的代码会启动:

在Junction__c上触发ConferenceAttendeesUpdater(插入后,                                                    更新后,                                                    删除后,                                                    取消删除之后                                                  ){

这看起来像是草率的代码,因为我认为只要更新了联结对象,触发器就会触发,而实际上只有当联系人的数量发生变化时才需要触发。出于某种原因,我在概念上掌握了我需要的方法。我想它会包括Junction__c.Contacts.size()来分配给会议的联系人数量吗?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

是的,如果您想计算与联系人相关的Junction__c记录的数量,您可以将触发器放在Junction__c对象上。最佳做法是将逻辑放在不在触发器中的类中。以下是您想要的粗略实现。

trigger ConferenceAttendeesUpdater on Junction__c (after insert, after update, after delete, after undelete ) {
  if ( Trigger.isAfter && Trigger.isInsert ){
    junctionHelper.afterInsert(Trigger.new);
  }
  if ( Trigger.isAfter && Trigger.isUpdate ){
    junctionHelper.afterUpdate(Trigger.new, Trigger.old);
  }
  if ( Trigger.isAfter && Trigger.isDelete ){
    junctionHelper.afterInsert(Trigger.old);
  }
  if ( Trigger.isAfter && Trigger.isUndelete ){
    junctionHelper.afterInsert(Trigger.new);
  }
}

public without sharing junctionHelper(){
  public static void afterInsert(List<Junction__c> newList){
    Map<Id,Contact> contactRollup = new Map<Id,Contact>();
    for ( Integer i=0;i<newList[i].size();i++ ){
      if ( newList[i].Contact__c != null ){
        contactMap.put(newList[i].Contact__c, new Contact(Id=newList[i].Contact__c,Number_of_Junctions__c=0));
      }
    }
  }
  public static void afterUpdate(List<Junction__c> newList, List<Junction__c> oldList){
    Map<Id,Contact> contactRollup = new Map<Id,Contact>();
    for ( Integer i=0;i<newList[i].size();i++ ){
      if ( newList[i].Contact__c != oldList[i].Contact__c ){
        contactMap.put(newList[i].Contact__c, new Contact(Id=newList[i].Contact__c,Number_of_Junctions__c=0));
      }
    }
  }
  public static void rollUpContacts(Map<Id,Contact> contactMap){
    for ( AggregateResult ar : [
      SELECT COUNT(Id) cnt, Contact__c parentId
      FROM Junction__c
      WHERE Contact__c IN :contactMap.keySet()
    ]{
      Id parentId = (String)ar.get('parentId);
      Decimal cnt = (Decimal)ar.get('cnt');
      contactMap.put(parentId,new Contact(Id=parentId,Number_of_Junctions__c=cnt));
    }
    update contactMap.values();
  }
}