在我的 APEX 触发器中,我有帐户的 ID,但我还需要提取该帐户的姓名和电话。 我可以编写 SOQL 并获取该信息,但我想知道是否还有另一种没有 SOQL 的方法。
我在下面尝试过,但它不起作用,因为 get() 是一个非静态方法。
Id newId = Id.valueOf(SfAccountId);
String accountName = Account.get(newId).Name;
“视情况而定”。
如果您确定只需要帐户名称和电话 - 您可以在对象上为其创建公式字段。即使在
before insert
触发器中,这些字段也应该可用 - 但前提是帐户查找是强制性的并且在页面布局上。您在这里有点依赖 Salesforce 的“执行顺序”,以及在它触发您的触发器之前检查它运行的内容。
对我来说,它总是感觉有点老套,太接近依赖了..好吧,不是无证行为,而是一些可疑的东西。如果它谈论页面布局 - 当没有 UI 时它将如何表现(集成?后台批处理作业?)。 https://salesforce.stackexchange.com/a/198487/799
Formula.recalculateFormulas(records)
,如果有必要的话,它会浪费 SOQL。
如果您不想为此浪费公式字段(姓名、电话,将来会怎样?)或者担心这将来可能会中断 - 使用此模式来收集帐户 ID,进行 1 个查询,然后进行第二个循环来处理它。避免“SOQL 循环”。
trigger xyzTrigger on xyz__c(before insert){
Map<Id, Account> accs = new Map<Id, Account>();
for(xyz__c x : trigger.new){
accs.put(x.Account__c, null);
}
accs.removeKey(null);
if(!accs.isEmpty()){
accs.putAll([SELECT Id, Name, Phone FROM Account WHERE Id IN :accs.keyset() WITH USER_MODE]);
for(xyz__c x : trigger.new){
Account a = accs.get(x.Account__c);
if(a != null){
x.Name = a.Name;
x.Phone__c = a.Phone;
}
}
}
}