2017-04-11 104 views
0

我有兩個完成相同事情的Apex方法。我對框架很陌生,只是想確保我正確地解釋它。我是否正確解釋這個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; 

我的假設是,這兩種方法着眼於每個被觸發帳戶,該帳戶的電話號碼附加到每個帳戶下的每個Contact.OtherPhone變量。方法1通過對每個聯繫人進行單獨更新來執行此操作,並且方法2通過將所有受影響的聯繫人推入到哈希映射中來立即更新。

這是否基本正確?澄清我遇到的任何錯誤將不勝感激。謝謝!

回答

0

你基本上是正確的,兩者都做了幾乎相同的事情,但我都不會使用。

長話短說,方法1不笨重,方法2是。

有關詳細信息我會說,

  • 在方法1中有一些可能出現的問題(也取決於代碼的其餘部分)

    1. 很可能擊中+ 100 SOQL Query Governor限制,因爲每個賬戶都有一個SOQL查詢
    2. 它很可能會觸及+150 DML語句
  • 在方法2中也有一些小問題

    1. 它正在經歷的所有元素,從trigger.new創建地圖,但trigger.newMap已經有地圖,所以它的處理能力浪費,除非你想比較oldMap和newMap來防止不必要的更新。
    2. contactsToUpdate不被任何聲明:P
  • 兩者都取在查詢的OtherPhone,但的OtherPhone將被重寫,所以除非你想用它做一些其他的邏輯,就沒有必要在soql查詢中獲取它(如果組織中的代碼複雜,則從堆大小中保存的每個字節都會有所幫助)。

無論哪種方式,這個功能甚至可以不使用進程生成的代碼來完成;)

我希望它有幫助。

+0

這是驚人的幫助,正是我在找什麼。非常感謝你的澄清。 – viloca