本篇參考:
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,感興趣的可以自行檢視。篇中有問題歡迎指出,有不懂歡迎留言。
作者:zero
部落格地址:http://www.cnblogs.com/zero-zyq/
本文歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線
如果文章的內容對你有幫助,歡迎點贊~
為方便手機端檢視部落格,現正在將部落格遷移至微信公眾號:Salesforce零基礎學習,歡迎各位關注。