本篇參考:
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信息。
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,感興趣的可以自行查看。篇中有問題歡迎指出,有不懂歡迎留言。