salesforce零基础学习(一百二十八)Durable Id获取以及相关概念浅入浅出

salesforce,基础,学习,一百二十八,durable,id,获取,以及,相关,概念 · 浏览次数 : 165

小编点评

**Schema Namespace** * 描述了表字段的结构,包括数据类型、主键、索引等信息。 * 可以用于查询表字段的配置,例如数据类型、约束条件等。 **EntityDefinition** * 提供对标准和自定义表的基于行级别的针对metadata的访问。 * 可以用于查询表字段的配置,例如数据类型、约束条件等。 * 除了标准字段外,还包含了子表的信息。 **FieldDefinition** * 提供对标准和自定义字段的基于行级别的针对metadata的访问。 * 可以用于查询表字段的配置,例如数据类型、约束条件等。 * 除了标准字段外,还包含了子表的信息。 ** Durable Id 的用途** * 作为表或字段的唯一标识符。 * 在使用之前要检索这个值,因为这个值不能保证从一个版本到另一个版本都是一样的。 * 简化查询,可以使用这个字段。

正文

本篇参考:

salesforce 零基础开发入门学习(十一)sObject及Schema深入

https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_entitydefinition.htm

https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_fielddefinition.htm

 想获取metadata相关的信息,我们第一件事想起来的可能就是 Schema Namespace,通过Schema命名空间的 DescribeSObjectResult 以及 DescribeFieldResult可以搞定很多事情。然而不是所有的metadata信息或者表字段信息都可以在 Schema命名空间下获取,今天我们讲一下表字段的 Durable Id的概念以及 EntityDefinition 以及 FieldDefinition的简单实用。

我们先来看下方的两个图的区别。

下图为Account表的自定义字段,我们看到 FieldAndRelationships后面是一个15位的ID

下图为Account的标准字段,我们可以看到URL直接展示的是Field API 名称。 

 其实不只是标准和自定义字段的区别,表同样适用于这个情况。所以问题来了, 15位ID是什么? 如何获取到?

15位ID是 Durable Id,用于作为表或者字段的唯一标识符。在使用之前一定要检索这个值,因为这个值不能保证从一个版本到另一个版本都是一样的。为了简化查询,可以使用这个字段。所以问题来了,为什么要有 Durable Id?举个例子,尽管在一个表中,字段的API Name是唯一的,但是不代表他不可以在修改。比如下图中 Upsert_Id__c字段已经应用于 page layout或者report中,即使修改了API Name,我们会发现UI还是直接显示,而不会移除,原因就是底层的metadata的mapping关系,不是通过API Name来关联的,而是通过 Durable Id或者是Id进行关联。

 

接下来的问题就是如何获取,可能大部分人第一想法就是查看 Schema命名空间,然后查看 DescribeObjectResult以及DescribeFieldResult这两个类的方法,很可惜,这两个类里面都没有相关的方法,那如何进行获取呢? 揭示今天的主角, Tooling API中的 EntityDefinition 以及 FieldDefinition这两个表。

一. FieldDefinition以及 EntityDefinition简单介绍

 EntityDefinition:此表用于提供对标准和自定义表的基于行级别的针对metadata的访问。基于此表的查询,也可以查询相关的子表的查询,官方文档中也同样做了一些描述。我们看一下下面的简单的例子:下图的搜索用于搜索Account表的 DeveloperName, NewUrl,同时搜索 Account的两个子信息。

1. Account表所有的字段信息,字段信息搜索了 DeveloperName以及 DurableId,

2. Account表所有的Record Type信息。

SELECT DeveloperName,QualifiedApiName,NewUrl,
    (SELECT Id, DeveloperName, DurableId FROM Fields),
    (SELECT Name FROM RecordTypes)
FROM EntityDefinition 
WHERE QualifiedApiName = 'Account'

除了上述的子查询以外,此表还有很多的允许查询的子表信息,更多可以查看官方文档。我们看一下输出的大致信息以及结构

通过这里我们可以看出来结构,以及针对标准和自定义字段的 DurableId的区别了。

 FieldDefinition:此表用于提供对标准和自定义字段的基于行级别的针对metadata的访问。上面的demo中返回的结构还是太过庞大,如果我们只想返回某个字段的信息,我们便可以通过 fieldDefinition的查询进行更好的结果返回,下方demo返回 Account Industry的信息

SELECT Id, DeveloperName, DurableId 
FROM FieldDefinition  
WHERE DeveloperName = 'Industry' 
AND EntityDefinition.QualifiedApiName = 'Account'

我们可以看一下结果展示

二. demo 

这两个表有很多字段,感兴趣的小伙伴可以自行查看每个字段的含义。我们再结合着上一篇的demo进行优化,封装一个方法,通过object api name以及field api name进行获取custom metadata type中维护的default value.

public with sharing class CommonUtils {
    public static String getDefaultValueFromMetadataType(String objectApiName, String fieldApiName) {
        List<Default_Value__mdt> defaultValueList = Default_Value__mdt.getAll().values();
        String result = '';
        String durableId;
        List<FieldDefinition> fieldDefinitionList = [SELECT Id, DurableId
                                                        FROM FieldDefinition
                                                        WHERE EntityDefinition.QualifiedApiName = :objectApiName
                                                        AND QualifiedApiName = :fieldApiName];
        if(fieldDefinitionList != null && !fieldDefinitionList.isEmpty()) {
            durableId = fieldDefinitionList.get(0).DurableId;
        }

        if(String.isNotBlank(durableId)) {
            for(Default_Value__mdt valueItem : defaultValueList) {
                if(durableId.equalsIgnoreCase(valueItem.Field_Name__c)) {
                    result = valueItem.Default_Value__c;
                }
            }
        }

        return result;
    }
}

简单调用的结果显示:

总结: 此篇仅是对于上一篇的补充,简单介绍了 DurableId以及 EntityDefinition和 FieldDefinition的概念和使用。篇中没有介绍特别详细字段以及limitation,感兴趣的可以自行查看。篇中有问题欢迎指出,有不懂欢迎留言。

与salesforce零基础学习(一百二十八)Durable Id获取以及相关概念浅入浅出相似的内容:

salesforce零基础学习(一百二十八)Durable Id获取以及相关概念浅入浅出

本篇参考: salesforce 零基础开发入门学习(十一)sObject及Schema深入 https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_enti

salesforce零基础学习(一百三十八)零碎知识点小总结(十)

本篇参考: https://help.salesforce.com/s/articleView?id=release-notes.rn_apex_5level_SOQLqueries.htm&release=250&type=5 https://developer.salesforce.com/to

salesforce零基础学习(一百二十)快去迁移你的代码中的 Alert / Confirm 以及 Prompt吧

本篇参考: https://developer.salesforce.com/blogs/2022/01/preparing-your-components-for-the-removal-of-alert-confirm-prompt https://help.salesforce.com/s/a

salesforce零基础学习(一百二十一)Limitation篇之Heap Size Limitation

本篇参考: https://help.salesforce.com/s/articleView?id=000384468&type=1 https://help.salesforce.com/s/articleView?id=000385712&type=1 此前讲过CPU limitation:s

salesforce零基础学习(一百二十二)通过 excel / csv创建 object

本篇参考: https://help.salesforce.com/s/articleView?id=sf.dev_objectcreate_task_lex_from_spreadsheet.htm&type=5 背景:当客户给我们N个表的数据,告诉我们需要创建一些新表,然后导入这些数据的时候,我

salesforce零基础学习(一百二十三)Transaction Security 浅入浅出

本篇参考: https://help.salesforce.com/s/articleView?id=sf.enhanced_transaction_security_policy_types.htm&type=5 https://developer.salesforce.com/docs/atla

salesforce零基础学习(一百二十四)Postman 使用

本篇参考: Salesforce 集成篇零基础学习(一)Connected App salesforce 零基础学习(三十三)通过REST方式访问外部数据以及JAVA通过rest方式访问salesforce 我们在项目中也经常遇见下游系统去和我们进行交互的情况,针对 salesforce可以提供 标

salesforce零基础学习(一百二十六) Picklist Value Set 优缺点和使用探讨

本篇参考:https://help.salesforce.com/s/articleView?id=sf.fields_creating_global_picklists.htm&type=5 当我们创建Picklist 字段时,比如很多表很多字段都会用到同样的 picklist value时,我们

salesforce零基础学习(一百二十七)Custom Metadata Type 篇二

本篇参考: salesforce零基础学习(一百一十一)custom metadata type数据获取方式更新 https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_methods_system_cu

salesforce零基础学习(一百二十九)Lead Conversion 有趣的经历

本篇参考:https://help.salesforce.com/s/articleView?id=000382564&type=1 Lead Conversion 是salesforce中sales cloud的一个很好用的功能。sales cloud流程可以简单的理解成 lead to cash