salesforce零基礎學習(一百二十八)Durable Id獲取以及相關概念淺入淺出 salesforce 零基礎開發入門學習(十一)sObject及Schema深入

本篇參考:

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,用於作爲表或者字段的唯一標識符。在使用之前一定要檢索這個值,因爲這個值不能保證從一個版本到另一個版本都是一樣的。爲了簡化查詢,可以使用這個字段。

接下來的問題就是如何獲取,可能大部分人第一想法就是查看 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,感興趣的可以自行查看。篇中有問題歡迎指出,有不懂歡迎留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章