カスタムオブジェクトでリレーションクエリを作成する
学習の目的
この単元を完了すると、次のことができるようになります。
- スキーマビルダーのダイアグラムを解釈して、オブジェクトリレーションを識別する。
- カスタムオブジェクトのクエリで使用するカスタムリレーション名を確認する。
- カスタムオブジェクトの子-親クエリを作成する。
- カスタムオブジェクトの親-子クエリを作成する。
一緒にトレイルを進みましょう
エキスパートの説明を見ながらこのステップを実行したい場合は、次の動画をご覧ください。これは Trailhead Live の「Trail Together」(一緒にトレイル) シリーズの一部です。
(巻き戻して最初から見直したい場合、このクリップは 51:38 分から開始されます。)
Trailhead Playground を起動してパッケージをインストールする
このモジュールのこれ以降の例やハンズオン演習では、DreamHouse という不動産業のサンプルアプリケーションを使用します。では、Trailhead Playground にこのアプリケーションをインストールして、サンプルデータをインポートしましょう。
Trailhead Playground がまだ開いていない場合は起動します。組織に [パッケージのインストール] というタブが表示されている場合は、ステップ 1 に進みます。表示されていない場合は、アプリケーションランチャー () で、[Playground Starter] をクリックして手順に従います。Playground Starter アプリケーションが表示されない場合は、DreamHouse パッケージへのこちらのリンクをクリックして、Trailhead ヘルプの「Trailhead の Challenge を完了するためのパッケージやアプリケーションのインストール」を参照してください。
- [パッケージのインストール] タブをクリックします。
- 項目に
04t3h000004mBpiAAE
を貼り付けます。 - [インストール] をクリックします。
- [管理者のみのインストール] を選択し、[インストール] をクリックします。
- サードパーティアクセスの承認を求めるプロンプトが表示されたら、[はい、これらのサードパーティ Web サイトにアクセスを許可します] を選択して、[続行] をクリックします。
パッケージのインストールが終了すると、確認ページが表示され、Playground に関連付けられているアドレスにメールが届きます。
DreamHouse データをインポートする
-
をクリックして、[検索] ボックスに
Dream
と入力し、[DreamHouse] アプリケーションを選択します。 - [設定] タブをクリックします。([設定] タブが表示されない場合は、[さらに表示] リストを展開します。)
- [データをインポート] をクリックします。
- [Properties (物件)] タブをクリックして、サンプルデータの内容を確認します。
DreamHouse のスキーマを確認する
これまでは、標準オブジェクトへのクエリのみを実行しました。この単元では、カスタムオブジェクトにクエリを実行する方法を説明します。ここでは DreamHouse アプリケーションのオブジェクトを使用するため、まず DreamHouse のスキーマ (データモデル) を確認してデータの構造を理解しておきます。
スキーマビルダーを開く
- Trailhead Playground で をクリックして [設定] を選択します。
- [オブジェクトマネージャー] をクリックします。
- [スキーマビルダー] をクリックします。
- [オブジェクト] タブで、[選択解除] をクリックします。
- Broker__c ではなく Broker と表示されている場合は、[ビューオプション] をクリックして、[要素名を表示] を選択します。
-
前述のとおり、コードでは項目の API 参照名を使用します。[要素名を表示] に、項目の表示ラベルではなく、項目の API 参照名が表示されます。(カスタムオブジェクトの API 参照名には、カスタムオブジェクト名の末尾に __c (アンダースコア + アンダースコア + c) が付いています。)
- [選択元] リストで、[カスタムオブジェクト] を選択します。
- [Broker__c] と [Property__c] を選択します。この単元ではこの 2 つのカスタムオブジェクトを使用します。
- [自動レイアウト] をクリックします。
- 物件の項目を確認します。
-
Property__c カスタムオブジェクトには、Picture__c と Broker__c という 2 つのカスタム項目があります。(カスタム項目の API 参照名には、カスタム項目名の末尾に __c (アンダースコア + アンダースコア + c) が付いています。)
- Property__c を Broker__c に結び付けるリレーション行にマウスポインターを置きます。
-
Property__c カスタムオブジェクトの Broker__c カスタム項目から Broker__c カスタムオブジェクトへの参照関係があります。
- [Property__c] 要素で歯車アイコンをクリックし、[オブジェクトを参照する] をクリックします。
オブジェクトマネージャーが開き、Property__c オブジェクトが表示されます。 - [項目とリレーション] をクリックします。
- [Broker (ブローカー)] という項目の表示ラベルをクリックします。
- [Lookup Options (参照オプション)] セクションで、[子リレーション名] を見つけます。
Property__c が Broker__c の子で、物件とブローカーのリレーションの名前が Properties であることがわかりました。(前述のとおり、リレーション名は通常、子オブジェクト名の複数形です。)
カスタムオブジェクトにクエリを実行する
カスタムオブジェクトに対するクエリは標準オブジェクトに対するクエリとよく似ていますが、いくつかの点が異なります。
たとえば、次の要件があるとします。
「物件の住所、写真、担当ブローカーを示す全物件のリストを取得する。」
特に難しいことではありません。Property__c カスタムオブジェクトにクエリを実行し、Address__c、Picture__c、Broker__c というカスタム項目を取得します。実際に試してみましょう。
クエリを作成する
- クエリエディターで、次のとおり入力します。
SELECT Address__c, Picture__c, Broker__c FROM Property__c
-
[Execute (実行)] をクリックします。
結果の最初の 6 行が次のようになります。Query Results - Total Rows: 12 (クエリ結果 - 行合計: 12) Address__c
Picture__c
Broker__c
18 Henry st
https://s3-us-west-2.amazonaws.com...
a016g000007Yxfn...
24 Pearl st
https://s3-us-west-2.amazonaws.com...
a016g000007Yxfn...
72 Francis st
https://s3-us-west-2.amazonaws.com...
a016g000007Yxfn...
32 Prince st
https://s3-us-west-2.amazonaws.com...
a016g000007Yxfn...
110 Baxter st
https://s3-us-west-2.amazonaws.com...
a016g000007Yxfn...
448 Hannover St
https://s3-us-west-2.amazonaws.com...
a016g000007Yxfn...
Broker__c 列の内容はさほど役立つものではありません。Property__c オブジェクトの Broker__c 項目が Broker オブジェクトへの参照であるためです。項目に参照関係がある場合は、関連するオブジェクトの ID が示されます。ブローカーの名前を取得するには、リレーションクエリが必要です。
子-親クエリを作成する
Broker__c は Property__c の親であるため、子-親クエリが必要です。ここでは、リレーション名とドット表記を使用して、Broker__c オブジェクトの Name 項目を取得します。
- クエリエディターで、次のとおり Broker__c を Broker__c.Name に変更します。
SELECT Address__c, Picture__c, Broker__c.Name FROM Property__c
-
[Execute (実行)] をクリックします。(エラーメッセージが表示されます。)
エラーメッセージ
Didn't understand relationship 'Broker__c' in field path.If you’re attempting to use a custom relationship, be sure to append the '__r' after the custom relationship name. (項目パスの「Broker__c」リレーションが認識されませんでした。カスタムリレーションシップを使用している場合は、カスタムリレーション名の後に「__r」を追加してください。)
何が起きたのでしょうか? 前述のとおり、Broker__c は Property (物件) オブジェクトのカスタム項目です。このクエリで必要なのは、Broker__c 関連オブジェクトです。
クエリでカスタムリレーション名を使用する
Broker__c 項目ではなく、Broker__c 関連オブジェクトを指定するには、__c を __r (アンダースコア + アンダースコア + r) に変更します。Broker__r はカスタムリレーション名で、Property__c から Broker__c オブジェクトに参照関係があることを示します。クエリのこの部分は、「Broker__c カスタム関連オブジェクトから Name 項目を取得する」に相当します。クエリを更新しましょう。
- クエリエディターで、次のとおり
Broker__c
をBroker__r
に変更します。SELECT Address__c, Picture__c, Broker__r.Name FROM Property__c
-
[Execute (実行)] をクリックします。
結果の最初の 6 行が次のようになります。Query Results - Total Rows: 12 (クエリ結果 - 行合計: 12) Address__c
Picture__c
Broker__r.Name
18 Henry st
https://s3-us-west-2.amazonaws.com...
Caroline Kingsley
24 Pearl st
https://s3-us-west-2.amazonaws.com...
Michael Jones
72 Francis st
https://s3-us-west-2.amazonaws.com...
Jonathan Bradley
32 Prince st
https://s3-us-west-2.amazonaws.com...
Jennifer Wu
110 Baxter st
https://s3-us-west-2.amazonaws.com...
Olivia Green
448 Hannover St
https://s3-us-west-2.amazonaws.com...
Miriam Aupont
わかりやすくなりました。ID ではなく、Broker (ブローカー) カスタムオブジェクトの [名前] 項目が表示されています。
親-子クエリを作成する
各物件とその担当ブローカーを返すことができました。この反対が必要なときはどうすればよいでしょうか?
次のような要件の場合です。
「すべてのブローカーの名前と、各ブローカーが担当するすべての物件の住所と価格を取得する。」
ブローカーのリストが必要なため、主クエリで Broker__c オブジェクトにクエリを実行します。
SELECT Name FROM Broker__c
ブローカーは親であるため、親-子クエリに子オブジェクトのサブクエリが必要です。ここでは、サブクエリに子リレーション名を使用します。
Property__c オブジェクトのサブクエリのリレーション名は何でしょうか? Property (物件) オブジェクトの [Broker (ブローカー)] 項目の詳細を確認します。
子リレーション名は Properties です。このリレーションはカスタムリレーションであるため、クエリに使用するときは、__r を追加します (Properties__r
)。したがって、このサブクエリ (括弧内) は次のようになります。
(SELECT Address__c, Price__c FROM Properties__r
)
このサブクエリを主クエリに挿入すると、クエリ全体が次のようになります。
SELECT Name, (SELECT Address__c, Price__c FROM Properties__r) FROM Broker__c
クエリを実行する
- クエリエディターで、次のとおり入力します。
SELECT Name, (SELECT Address__c, Price__c FROM Properties__r) FROM Broker__c
-
[Execute (実行)] をクリックします。
結果の最初の 8 行が次のようになります。
これこそ必要としていた情報です。ブローカー全員のリストと、各ブローカーの物件のカンマ区切りリストを手に入れることができました。クエリを構築するときは、開発者コンソールのクエリエディターで SOQL クエリを簡単にテストして調整する機能を使えることを覚えておいてください。