この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

SOQL クエリの多態的なリレーションの処理

多態的なリレーションは、参照されるオブジェクトに複数の異なる種別を使用できるオブジェクト間のリレーションです。たとえば、Event の What リレーション項目には Account、Campaign、Opportunity のいずれかを使用できます。

Apex で多態的なリレーションの SOQL クエリを使用する方法についての説明を次に示します。多態的なリレーションについてのより一般的な情報は、『Force.com SOQL および SOSL リファレンス』の多態的なキーとリレーションについてを参照してください。

Apex で多態的な項目を参照する SOQL クエリを使用して、多態的な項目によって参照されるオブジェクト種別に依存する結果を取得できます。1 つのアプローチとして、Type 修飾子を使用して結果を絞り込むという方法があります。次の例では、What 項目を使用して Account または Opportunity に関連する Event をクエリします。
1List<Event> = [SELECT Description FROM Event WHERE What.Type IN ('Account', 'Opportunity')];
別のアプローチとして、SOQLSELECT ステートメントで TYPEOF 句を使用する方法があります。この例でも、What 項目を使用して Account または Opportunity に関連する Event をクエリします。
1List<Event> = [SELECT TYPEOF What WHEN Account THEN Phone WHEN Opportunity THEN Amount END FROM Event];

TYPEOF は、現在 SOQL 多態性機能の一部の開発者プレビューとして利用可能です。組織での TYPEOF の有効化については、Salesforce にお問い合わせください。

メモ

これらのクエリは、リレーション項目が目的のオブジェクト種別を参照する sObject のリストを返します。
多態的なリレーションで参照されるオブジェクトにアクセスする必要がある場合は、オブジェクト種別を判���するために instanceof キーワードを使用できます。次の例では、instanceof を使用して、Account または Opportunity が Event に関連しているかどうかを判断します。
1Event myEvent = eventFromQuery;
2if (myEvent.What instanceof Account) {
3    // myEvent.What references an Account, so process accordingly
4} else if (myEvent.What instanceof Opportunity) {
5    // myEvent.What references an Opportunity, so process accordingly
6}
別のメソッドに渡す前に、クエリが返す参照される sObject を適切な種別の変数に割り当てる必要があります。次の例では、TYPEOF 句を含む SOQL クエリを使用して Merchandise__c カスタムオブジェクトの User または Group 所有者をクエリし、instanceof を使用して所有者の種別を判断してから、ユーティリティメソッドに渡す前に所有者オブジェクトを User または Group の種別の変数に割り当てます。
1swfobject.registerObject("clippy.codeblock-3", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class PolymorphismExampleClass {
18
19    // Utility method for a User
20    public static void processUser(User theUser) {
21        System.debug('Processed User');
22    }
23    
24    // Utility method for a Group
25    public static void processGroup(Group theGroup) {
26        System.debug('Processed Group');
27    }
28
29    public static void processOwnersOfMerchandise() {
30        // Select records based on the Owner polymorphic relationship field
31        List<Merchandise__c> merchandiseList = [SELECT TYPEOF Owner WHEN User THEN LastName WHEN Group THEN Email END FROM Merchandise__c];	
32        // We now have a list of Merchandise__c records owned by either a User or Group
33        for (Merchandise__c merch: merchandiseList) {
34            // We can use instanceof to check the polymorphic relationship type
35            // Note that we have to assign the polymorphic reference to the appropriate
36            // sObject type before passing to a method
37            if (merch.Owner instanceof User) {
38                User userOwner = merch.Owner;
39                processUser(userOwner);
40            } else if (merch.Owner instanceof Group) {
41                Group groupOwner = merch.Owner;
42                processGroup(groupOwner);
43            }
44        }
45    }
46}
47