salesforce 零基礎開發入門學習(四)多表關聯下的SOQL以及表字段Data type詳解


建立好的數據表在數據庫中查看有很多方式,本人目前采用以下兩種方式查看數據表。

1.采用schema Builder查看表結構以及多表之間的關聯關系,可以登錄后點擊setup在左側搜索框輸入schema Builder 或者build-->schema Builder進入;

2.采用force.com Explorer通過自己寫查詢語句來查詢數據。

此鏈接為force.com Explorer的下載鏈接:  http://force-com-explorer-beta.software.informer.com/

下載完成后通過用戶,密碼,Security token賬號登陸即可,見(篇一)。

此篇主要講解表字段的Data type的每種類型以及多表關聯下的SOQL查詢,由於多表關聯涉及到Data type中的look up或者master-detail,所以先講一下Data type類型。

一)Data type

當數據表創建表的列時,會選擇Data Type,不同的Data Type在頁面處理以及數據插入時會有不同的處理。而且不同的字段會有其相對應的數據類型與之對應。

1.Auto Number:系統生成的序列號,通過自身定義的形式顯示,為每條新紀錄自動遞增數;

2Formula:聲明一個計算式,功能很強大,以后會單獨篇章講解formula用法;

3.Lookup Relationship:創建鏈接一個對象和另一個對象的關系,創建關系后,通過一個對象可以訪問另一個對象的內容信息;

4.Master-Detail Relationship:創建一個特殊的父子關系(主從關系),和lookup Relationship 的相同與差異在下面介紹;

5.External Lookup Relationship:創建一個對象和另一個額外對象的關系。其中這個對象的數據存儲在額外對象的數據源中;

6.Checkbox:聲明一個布爾類型;

7.Currency:聲明一個貨幣類型;

8.Date:聲明一個Date類型,用戶在前台綁定后可以直接使用Date類型相應的控件;

9.Date/Time:聲明一個Date和Time類型,用戶選擇日期后,日期和當前時間便賦值到輸入域;

10.Email:聲明一個Email類型;

11.Geolocation:聲明一個位置的類型,此類型包含經緯度信息;

12.Number:允許輸入任何的數字,如果輸入的全是0則全部移除;

13.Percent:聲明一個百分比類型;

14.Phone:聲明一個手機號碼類型,輸入的內容自動轉換成此類型;

15.Picklist:聲明一個列表類型,類似於HTML中的<select><option></option></select>關系,下面會有例子講解;

16.Picklist(Multi-Select):聲明一個列表類型,區別上面的為允許多選;

17.Text:聲明一個字符串類型,最大長度為255;

18.Text Area:和Text類型相似,區別為內容可以換行;

19.Text Area(Long):和Text Area相似,最大長度為131072;

20.Text Area(Rich):富輸入框,可以存儲圖片等;

21.Text(Encrypted):可以加密的形式存儲;

22.URL:聲明一個URL類型。

在項目中有一些是我們需要經常用到的類型,比如2,3,4,6,7,8,9,10,12,15,16,17,19,20,22.有一些類型配置相對簡單,選中Data type 類型,輸入字段名稱然后一直執行下一步便可以完成操作;有一些類型配置則相對麻煩。接下來主要描述Lookup Relationship,Master-detail Relationship,Picklist這三種類型配置。

1)PickList

PickList聲明一組數據,類似HTML中的選擇框。通常用於確定的內容選擇,比如學生表可以聲明學生的學歷--Education__c字段。他的值為確定范圍的:幼稚園,小學,初中,高中,大學。。。所以這個字段可以聲明為PickList類型字段。即此字段適用於值是確定范圍的,有窮的情況。

聲明PickList操作步驟如下:

1.如果存在Student表情況下,在setup-->create-->Objects下找到Student,點擊進入。如果不存在Student,則按照上一篇步驟新建Student表;

2.在Custom Fields & Relationships模塊下點擊add新建一個字段並選擇PickList點擊Next;

3.在Field Label 中輸入Education,鼠標移動到Field Name中則自動輸入。將Value選擇第二個Enter Value ,並在輸入框中輸入相應值,如圖1所示;

4.一直選擇Next,最后點擊Save按鈕新增PickList類型字段。

                                                                    圖1

2)Lookup Relationship 與Master-detail Relationship

二者均可以關聯兩個數據表,實現其他數據庫語言類似join功能,二者區別如下:

1.master detail關系比較緊密,可以自動進行級聯刪除,Lookup 關系相對靈活,不可以級聯刪除,如果刪除操作,則需要先刪除從表,再刪除主表操作;

2.用lookup允許父為空,master不允許--master模式需要級聯刪除,如果master情況父為空則無法級聯刪除。

具體使用那種分數據表關系,如果數據表關聯比較緊密,刪除時需要級聯刪除則可以選擇master-detail模式,如果關系相對松散,希望表之間靈活控制,則推薦使用lookup關系。

 以權限表和角色表兩個表關系來引入Look up.

做過權限管理的人都知道,一個權限可以對應多個角色,一個角色可以分配多種權限,權限與角色是多對多關系。比如,查看文章的權限可以是管理員具有查看權利,也可以是普通用戶具有查看的權利;一個管理員可以有查看的權限,也可以有修改的權限。所以應該引入一個中間表角色權限表作為中間表,實現以上的數據表結構構造,如圖2所示。

 

                                                                    圖2

通過圖2可以看出,PRIVELEGEROLE__c外鍵依賴於PRIVELEGE__c 以及 ROLE__c,即PRIVELEGEROLE__c的PRIVELEGEID__c字段與PRIVELEGE__c的Id字段進行關聯,PRIVELEGEROLE__c的ROLEID__c的Id字段進行關聯,通過這兩個關聯字段可以訪問到這兩個關聯的表中。訪問方式比較特殊,即通過PRIVELEGEID__r可以訪問到PRIVELEGE表(對應的sObject為PRIVELEGE__c)中的字段,通過ROLEID__r可以訪問到ROLE表(對應的sObject為ROLE__c)中的字段。

注意:這三個表如果按照Master-Detail關系情況,則PRIVELEGE__c和ROLE__c為主表,PRIVELEGEROLE__c為從表(外鍵依賴於另外兩個表)。通過外鍵依賴的sObject,將sObject最后的c改成r便可以訪問此表。eg:

SELECT
     PRIVELEGEID__r.Id,PRIVELEGEID__r.PRIVELEGENAME__c,
     ROLEID__r.ROLENAME__c, Id
FROM PRIVELEGEROLE__c

通過上面例子可以看出:PRIVELEGEROLE__c表中的PRIVELEGEID__c是表中的一個字段,通過LookUp關系關聯到PRIVELEGE__c,則PRIVELEGEID__r則相當於PRIVELEGE__c表的一個引用,通過PRIVELEGEID__r則可以訪問PRIVELEGE__c表中的數據,為了更加明確的了解,將數據表查詢結果通過JSON形式顯示,便會更加的一目了然。通過查詢輸出的json結果可以看出,PRIVELEGEID__r他的類型為PRIVELEGE__c,並且把此條記錄中的PRIVELEGE__c需要的字段信息查出,ROLEID__r類型為ROLE__c,並且將此條記錄中ROLE__c表需要的字段信息查出。推薦下方的網頁查看json,它可以將輸出的混亂的json格式變得整潔,增強可讀性。

json在線轉換網頁:http://json.parser.online.fr/

查詢結果轉成JSON語句:

String queryString = 'SELECT              
                      PRIVELEGEID__r.Id,PRIVELEGEID__r.PRIVELEGENAME__c,
                      ROLEID__r.ROLENAME__c, ROLEID__c, Id 
                      FROM PRIVELEGEROLE__c';
List<PRIVELEGEROLE__c> prs = Database.query(queryString);
String queryJson = JSON.serialize(prs);
System.debug(queryJson);

以下為查詢的輸出json結果。

 1 [
 2     {
 3         "attributes":{
 4         "type":"PRIVELEGEROLE__c",
 5         "url":"/services/data/v36.0/sobjects/PRIVELEGEROLE__c/a03280000089RbkAAE"
 6         },
 7         "PRIVELEGEID__c":"a012800000KufW5AAJ",
 8         "ROLEID__c":"a0228000008fwJ6AAI",
 9         "Id":"a03280000089RbkAAE",
10         "PRIVELEGEID__r":{
11             "attributes":{
12                 "type":"PRIVELEGE__c",
13                 "url":"/services/data/v36.0/sobjects/PRIVELEGE__c/a012800000KufW5AAJ"
14             },
15             "Id":"a012800000KufW5AAJ",
16             "PRIVELEGENAME__c":"權限添加"
17         },
18         "ROLEID__r":{
19             "attributes":{
20                 "type":"ROLE__c",
21                 "url":"/services/data/v36.0/sobjects/ROLE__c/a0228000008fwJ6AAI"
22             },
23             "Id":"a0228000008fwJ6AAI",
24             "ROLENAME__c":"角色添加"
25         }
26     }
27 ]

接下來講解如何在網站中構建出LookUp關系,如果不懂如何創建表和字段,請查看上一篇內容。

1.創建PRIVELEGE表,按照圖二的表結構可以看出,需要創建PRIVELEGENAME和PRIVELEGEDESCRIBE兩個字段,創建后,系統會自動為其創建API Name;

2.創建ROLE表,按照圖二的表結構可以看出,需要創建ROLENAME和ROLEDESCRIBE兩個字段,創建后,系統會自動為其創建API NAME;

3.創建PRIVELEGEROLE表;

4.創建和PRIVELEGE表的依賴,新增一個字段,Datatype選擇LookUp,點擊Next,如圖3;

5.在Relate To下拉框處選擇需要關聯的表,此處選擇PRIVELEGE表,如圖4,然后點擊Next;

6.在Field Label 輸入字段名稱,此處輸入PRIVELEGEID,鼠標移動到Field Name,則自動賦值,如圖5,一直點擊next;

7.點擊save&new按鈕,重復4--6步驟,將於ROLE表關聯的字段創建,Field Label處輸入ROLEID,最后save,關聯結束,如圖6.

                                 

             圖3                                                                                  圖4

            

                        圖5                                                                                           圖6

使用Master-Detail關系和使用LookUp關系創建基本相同,這里不在做說明。

接下來說明DML操作。現在說一下增刪查操作,改操作和其他相同,則不再講述。

上述代碼查詢出來的內容為PRIVELEGEROLE__c對象,那么如何檢索出需要的PRIVELEGE__c對象的字段或者ROLE__c對象的字段呢?

apex提供簡單的方式來處理,即如果各層級嵌套,則可以通過類似A.B.C方式來獲取需要的內容。查詢操作代碼將與刪除操作代碼在下方一起顯示。 

因為表之間存在關聯關系,所以進行增加操作時,應先處理主表,然后再處理從表;進行刪除操作時,應先刪除從表,在刪除主表。

這里在啰嗦一下:主表表示獨立的表,從表表示外鍵依賴於其他表的表。主表有時也被成為父表,子表有時也被成為子表,上述的例子中,PRIVELEGEROLE為從表,其他為主表

增加操作代碼舉例:

PRIVELEGE__c privelege = new PRIVELEGE__c(PRIVELEGENAME__c='權限添加',PRIVELEGEDESCRIBE__c='權限描述');
ROLE__c role = new ROLE__c(ROLENAME__c='角色添加',ROLEDESCRIBE__c='角色描述');
insert privelege;//執行insert后,privelege的ID字段便會自動被賦值,且唯一
insert role;
ID roleId = [select Id from ROLE__c limit 1][0].ID;
ID privelegeId = [select Id from PRIVELEGE__c limit 1][0].ID;
PRIVELEGEROLE__c privelegeRole = new PRIVELEGEROLE__c();
privelegeRole.ROLEID__c = roleId;
privelegeRole.PRIVELEGEID__c = privelegeId;
insert privelegeRole;
//添加操作需要先添加主表,主表添加以后,ID便自動賦值,然后再取出ID操作從表。

刪除操作代碼舉例:

 1 String deletePrivelegeRoleSql = 'SELECT  ROLEID__c,     
 2                                                 Id,PRIVELEGEID__r.ID,ROLEID__r.ID' +  
 3                                                 'FROM PRIVELEGEROLE__c';
 4 List<SObject> privelegeRoles = Database.query(deletePrivelegeRoleSql);
 5          
 6  if(privelegeRoles.size() > 0) {//查詢有記錄的時候才對子表進行刪除操作
 7              
 8      PRIVELEGEROLE__c privelegeRole = (PRIVELEGEROLE__c)privelegeRoles[0];
 9      ID privelegeId = privelegeRole.PRIVELEGEID__r.ID;//通過層級A.B.C可以查出需要使用的變量
10      ID roleId = privelegeRole.ROLEID__r.ID;
11      try {
12        Database.delete(privelegeRole.Id);
13      } catch(Exception e) {
14        System.debug('error occured when deleting privelegerole!');
15      }
16 
17       try {
18             Database.delete(privelegeId);
19         Database.delete(roleId);
20       } catch(DmlException e) {
21         System.debug('error occured when deleting privelege or role');
22       }
23 }
//先刪除從表,在刪除主表。刪除從表后,表數據即消失。所以在表數據刪除以前,需要先將需要的數據取出,比如上述的ID字段

通過此篇,可以對表關聯操作有一個基礎的認識,如果需要詳細了解內容,請查看官方的PDF文檔。如果篇中有寫錯的地方,歡迎批評指正。有不懂得地方也可以留言。

下一篇將介紹批處理的簡單使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM