我是否正确解释了这个 Apex 代码?

Am I interpreting this Apex code correctly?

我有两个 Apex 方法可以完成同样的事情。我是该框架的新手,只是想确保我正确地解释了它。

//Method 1: 
for (Account a : trigger.new) { 
  for (Contact c : [SELECT Id, OtherPhone FROM Contact WHERE AccountId= :a.Id]) { 
     c.OtherPhone= a.Phone; update c; } } 

//Method 2: 
for (Account a :trigger.new){ 
  acctMap.put(a.Id, a); 
}

for (Contact c : [SELECT Id, OtherPhone, AccountId FROM Contact WHERE 
AccountIdIN :acctMap.keySet()]){ 
  c.OtherPhone = acctMap.get(c.AccountId).Phone; 
  contactsToUpdate.add(c); 
} 
update contactsToUpdate;

我的假设是,这两种方法都会查看每个被触发的帐户,并将帐户 phone 编号附加到每个帐户下的每个 Contact.OtherPhone 变量。方法 1 通过对每个联系人进行单独更新来执行此操作,方法 2 通过将所有受影响的联系人推送到哈希图中来一次更新所有受影响的联系人。

这基本上是正确的吗?澄清任何我出错的地方将不胜感激。谢谢!

你基本上是对的,两者做的事情几乎是一样的,但我都不会用。

长话短说,方法一不笨重,方法二笨重。

有关详细信息,我会说

  • 方法 1 中可能存在一些问题(也取决于代码的其余部分)

    1. 可能会达到 +100 SOQL 查询调控器限制,因为每个帐户都执行一个 SOQL 查询
    2. 很有可能命中+150个DML语句
  • 方法二也有一些小问题

    1. 它正在遍历所有元素以从 trigger.new 创建地图,但是 trigger.newMap 已经有了地图,所以它的处理能力被浪费了,除非你想将 oldMap 与newMap 以防止不必要的更新。
    2. contactsToUpdate 未在任何地方声明 :P
  • 两者都在查询 OtherPhone 中获取,但是 OtherPhone 将被覆盖,所以除非你想用它做一些其他逻辑,否则不需要在 soql 查询中获取它(如果组织中的代码很复杂,从堆大小中节省的每个字节都有帮助。

无论哪种方式,这个功能甚至可以在没有代码的情况下使用进程构建器来实现;)

希望对您有所帮助。