Salesforce ではオブジェクトに 参照関係
もしくは 主従関係
としてリレーション項目を設定できます。
このリレーションを用いて、1度の SOQL で親子関係にあるオブジェクトを一括で取得する方法を備忘録として記載します。
この記事では、親オブジェクトから子オブジェクト、およびその逆の取得方法について紹介します。
親オブジェクト → 子オブジェクトの取得
親オブジェクトのレコードのIDがわかっている場合に、そのレコードに紐づく子オブジェクトを一括で取得するSOQL および Apexの書き方です。
Id parentId = 'your object id';
List<Parent__c> parentWithChildren = [
SELECT Name, (
SELECT Id, Name FROM Childs__r
)
FROM Parent__c
WHERE Id = :parentId
];
for (Parent__c parent : parentWithChildren) {
System.debug('Parent Name: ' + parent.Name);
for (Child__c child : parent.Childs__r) {
System.debug('Child Name: ' + child.Name);
}
}
ここでは、例として親子関係にあるオブジェクトを Parentc, Childc としています。 また、リレーション項目は Childs__r とします。
Salesforce では SELECT 句の中で、定義されているリレーション項目を利用して子オブジェクトを一括で取得できます。
取得した Child__c は List 形式なので、 for 文で処理します。
子オブジェクト → 親オブジェクト の取得
子オブジェクトのIDがわかっている場合に、その親オブジェクトを一緒に取得する方法です。
Id childId = 'your object id';
Child__c child = [
SELECT Name, Parent__r.Name
FROM Child__c
WHERE Id = :childId
];
System.debug('Child Name: ' + child.Name);
System.debug('Parent Name: ' + child.Parent__r.Name);
例として利用するオブジェクトは先ほどと同じ、Parentc, Childc としています。
子 → 親 の場合は、親オブジェクトの項目を Parent__r.
で取得できます。
この場合は、取得した Child__c のレコードの1カラムとして取得されているので、for文等の利用は不要です。
ひとこと
Salesforce 組織で SOQL を利用する際は、ガバナ制限を常に意識しなければなりません。 SOQLも、なるべく簡潔な書き方で効率よくデータ取得ができるように心がけましょう。
コメント