Salesforce APEX 通过 ID 获取帐户记录的名称,无需 SOQL

问题描述 投票:0回答:1

在我的 APEX 触发器中,我有帐户的 ID,但我还需要提取该帐户的姓名和电话。 我可以编写 SOQL 并获取该信息,但我想知道是否还有另一种没有 SOQL 的方法。

我在下面尝试过,但它不起作用,因为 get() 是一个非静态方法。

        Id newId = Id.valueOf(SfAccountId);
        String accountName = Account.get(newId).Name;
salesforce apex
1个回答
0
投票

“视情况而定”。

如果您确定只需要帐户名称和电话 - 您可以在对象上为其创建公式字段。即使在

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;
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.