dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

[Salesforce]参照関係にあるオブジェクトをSOQLで取得する

メモ。

標準オブジェクトの場合と、カスタムオブジェクトの場合について整理。
こちらの公式ドキュメントが参考になる。

Salesforce Developers

標準オブジェクト

f:id:dackdive:20150424175613g:plain (画像は http://www.salesforce.com/us/developer/docs/dbcom_soql_sosl/Content/sforce_api_calls_soql_relationships.htm より引用)

上の例では標準オブジェクトであるAccountContactについて書かれており、
親(Parent)が Account、子(Child)が Contact という位置づけになる。

Child-to-parent:子 (Contact) から親 (Account) を参照
SELECT Id, Name, Account.Id, Account.Name FROM Contact

f:id:dackdive:20150424181949p:plain

親のSObject名.親の項目名 で親の項目を取得できる。

Parent-to-child:親 (Account) から子 (Contact) を参照
SELECT Id, Name, (SELECT Id FROM Contacts) FROM Account

f:id:dackdive:20150424181942p:plain

ちなみに、親から子を参照する場合、子から親を参照する場合の API 参照名については
子の参照関係項目を見るとわかる。

取引先責任者 > 項目 > 取引先名

f:id:dackdive:20150424181137p:plain

カスタムオブジェクト

ここでは、参照関係にある2つのカスタムオブジェクトを考える。

親オブジェクト:ParentObj__c  
子オブジェクト:ChildObj__c

どっちが親でどっちが子かというと、参照関係の項目を作った方が子 です。

Child-to-parent:子(ChildObj__c)から親(ParentObj__c)を参照
SELECT Id, Name, ParentObj__c, ParentObj__r.name FROM ChildObj__c

ParentObj__c で取れるのは Id のみ。Id 以外の項目を取る時は __c でなく __r にする。

Parent-to-child:親(ParentObj__c)から子(ChildObj__c)を参照
SELECT Id, Name, (SELECT Id, Name FROM [子リレーション名]__r) FROM ParentObj__c

子リレーション名は参照関係の項目を作成するときに決める。

f:id:dackdive:20150424182320p:plain

通常複数形にすることが多い。

Apexコードでの利用例

子(ChildObj__c)から親(ParentObj__c)を参照
List<ChildObj__c> children = [SELECT Id, Name, ParentObj__c, ParentObj__r.name FROM ChildObj__c];

// 親オブジェクトのnameフィールドの値を表示
System.debug(children.parentObj__r.name);
親(ParentObj__c)から子(ChildObj__c)を参照
List<ParentObj__c> parents = [SELECT Id, Name, (SELECT Id, Name FROM ChildObjs__r) FROM ParentObj__c];

// 子オブジェクトのnameフィールドの値を表示
for (ChildObj__c child : parents.childObjs__r) {
    System.debug(child.name);
}

注意点は、子オブジェクトはListで渡されるというところぐらい。