sObject リレーションのトラバースとクエリ
sObject リレーションとドット表記
2 つの sObject がリレーションを介して互いに関連付けられる場合、一方の sObject の親 sObject を次のドット表記構文を使用して取得できます。
1sObjectTypeName parentObject = objectA.RelationshipName;親 sObject の項目を次のようにリレーション名に付加してその項目にアクセスすることもできます。
1DataType s = objectA.RelationshipName.FieldName;同様に、同じ構文を使用して sObject の子 sObject を取得できます。唯一の違いは、sObject の子レコードが 1 つ以上のコレクションであるのに対し、上述の場合は親レコードが 1 つのみであることです。構文は次のようになります。
1List<sObjectTypeName> children = objectA.ChildRelationshipName;sObject リレーションのクエリ
sObject が別の sObject に主従関係または参照関係で関連付けられている場合、SELECT ステートメントにリレーション名と項目名を次のように指定して、親 sObject 項目をクエリできます。
1SELECT RelationshipName.Field FROM sObjectName WHERE Where_Condition [...]子 sObject をフェッチするには、要求するすべての子 sObject とその項目を取得するネストしたクエリを次のように指定します。
1SELECT field1, field1, ..., (Nested query for child sObjects)
2 FROM sObjectName WHERE Where_Condition [...]実際に試してみる
次の例は、請求書明細と品目名の間に存在する主従関係をトラバースする方法を示します。最初に、クエリに Invoice_Statement__r.Name を指定し、特定の品目名の親請求書明細の名前をクエリします。続いて、ステートメント li.Invoice_Statement__r.Name で、返された品目名 sObject から請求書明細 sObject とその名前を取得します。次のコードを実行します。
1Line_Item__c li = [SELECT Invoice_Statement__r.Name FROM Line_Item__c LIMIT 1];
2// Traverses a relationship using the dot notation.
3System.debug('Invoice statement name: ' + li.Invoice_Statement__r.Name);SELECT ステートメントの Invoice_Statement__r 項目の末尾は __r です。このサフィックスは、この項目がリレーション項目であることを示します。これは外部キーのように機能し、クエリした品目名の親請求書明細を参照します。
次のような出力が返されます。
Invoice statement name: INV-0000
次の 2 つ目の例は、子 sObject の取得方法を示します。ネストしたクエリ (SELECT Value__c FROM Line_Items__r) を使用して請求書明細の子品目名を取得します。続いて、返された請求書明細 sObject を使用して請求書明細の子品目名を取得します。
1Invoice_Statement__c inv = [SELECT Id, Name, (SELECT Units_Sold__c FROM Line_Items__r)
2 FROM Invoice_Statement__c
3 WHERE Name='INV-0000'];
4// Access child records.
5List<Line_Item__c> lis = inv.Line_Items__r;
6System.debug('Number of child line items: ' + lis.size());ネストしたクエリは Line_Items__r から子レコードを取得します。Line_Items__r の __r サフィックスは、これがリレーションの名前であることを示します。このネストしたクエリは、Line_Items__r で表される主従関係を使用して請求書明細の子品目名を取得します。
サンプルの請求書明細に含まれる品目名は 1 つのみであるため、この例では次のように出力されます。
Number of child line items: 1