4

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

 1 year ago
source link: https://www.cnblogs.com/zero-zyq/p/17240117.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

salesforce零基础学习(一百二十八)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

910966-20230321151124727-621774426.png

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

910966-20230321151156839-1620357822.png

 其实不只是标准和自定义字段的区别,表同样适用于这个情况。所以问题来了, 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信息。

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

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

910966-20230322171147690-1403544320.png

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

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

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

我们可以看一下结果展示

910966-20230322180944613-1994231284.png

二. 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;
    }
}

简单调用的结果显示:

910966-20230322183932352-2118495379.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK