salesforce零基础学习(一百二十八)Durable Id获取以及相关概念浅入浅出
本篇参考:
salesforce 零基础开发入门学习(十一)sObject及Schema深入
想获取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,用于作为表或者字段的唯一标识符。在使用之前一定要检索这个值,因为这个值不能保证从一个版本到另一个版本都是一样的。为了简化查询,可以使用这个字段。
接下来的问题就是如何获取,可能大部分人第一想法就是查看 Schema命名空间,然后查看 DescribeObjectResult以及DescribeFieldResult这两个类的方法,很可惜,这两个类里面都没有相关的方法,那如何进行获取呢? 揭示今天的主角, Tooling API中的 EntityDefinition 以及 FieldDefinition这两个表。
一. FieldDefinition以及 EntityDefinition简单介绍
EntityDefinition:此表用于提供对标准和自定义表的基于行级别的针对metadata的访问。基于此表的查询,也可以查询相关的子表的查询,官方文档中也同样做了一些描述。我们看一下下面的简单的例子:下图的搜索用于搜索Account表的 DeveloperName, NewUrl,同时搜索 Account的两个子信息。
1. Account表所有的字段信息,字段信息搜索了 DeveloperName以及 DurableId,
2. Account表所有的Record Type信息。
SELECTDeveloperName,QualifiedApiName,NewUrl,
(SELECT Id, DeveloperName, DurableId FROMFields),
(SELECT Name FROMRecordTypes)FROMEntityDefinitionWHERE QualifiedApiName = 'Account'
除了上述的子查询以外,此表还有很多的允许查询的子表信息,更多可以查看官方文档。我们看一下输出的大致信息以及结构
通过这里我们可以看出来结构,以及针对标准和自定义字段的 DurableId的区别了。
FieldDefinition:此表用于提供对标准和自定义字段的基于行级别的针对metadata的访问。上面的demo中返回的结构还是太过庞大,如果我们只想返回某个字段的信息,我们便可以通过 fieldDefinition的查询进行更好的结果返回,下方demo返回 Account Industry的信息
SELECTId, DeveloperName, DurableIdFROMFieldDefinitionWHERE DeveloperName = 'Industry' AND EntityDefinition.QualifiedApiName = 'Account'
我们可以看一下结果展示
二. demo
这两个表有很多字段,感兴趣的小伙伴可以自行查看每个字段的含义。我们再结合着上一篇的demo进行优化,封装一个方法,通过object api name以及field api name进行获取custom metadata type中维护的default value.
public withsharing class CommonUtils {publicstatic 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;
}
}
}returnresult;
}
}
简单调用的结果显示:
总结:
此篇仅是对于上一篇的补充,简单介绍了 DurableId以及 EntityDefinition和 FieldDefinition的概念和使用。篇中没有介绍特别详细字段以及limitation,感兴趣的可以自行查看。篇中有问题欢迎指出,有不懂欢迎留言。