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

2023-03-22 21:01:17

本篇參考:

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,感興趣的可以自行檢視。篇中有問題歡迎指出,有不懂歡迎留言。