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

創建好的數據表在數據庫中查看有不少方式,本人目前採用如下兩種方式查看數據表。java

1.採用schema Builder查看錶結構以及多表之間的關聯關係,能夠登陸後點擊setup在左側搜索框輸入schema Builder 或者build-->schema Builder進入;sql

2.採用force.com Explorer經過本身寫查詢語句來查詢數據。數據庫

此連接爲force.com Explorer的下載連接:  http://force-com-explorer-beta.software.informer.com/json

下載完成後經過用戶,密碼,Security token帳號登錄便可,見(篇一)。網站

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

一)Data type加密

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

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

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

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文檔。若是篇中有寫錯的地方,歡迎批評指正。有不懂得地方也能夠留言。

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

相關文章
相關標籤/搜索