最初の SOQL クエリを記述する
Trail Together の動画
エキスパートの説明を見ながらこのステップを進めて行きたい場合は、Trail Together シリーズの一部である、こちらの動画をご覧ください。
(巻き戻して最初から見直したい場合、このクリップは 02:33 分から開始されます。)
はじめに
このステップではシンプルな Lightning コンポーネントと Apex コントローラーを作成します。そして、データを表示するようにコンポーネントを更新して、基本 SQL を SOQL に変換します。
Lightning コンポーネントバンドルを作成する
組織を作成し、パッケージをインストールして、データをインポートしたところで、次は変換した SQL クエリから簡単なデータを表示する Lightning コンポーネントを作成しましょう。
- 開発者コンソールを開きます。
- 開発者コンソールで開いているタブがあれば閉じて、[File (ファイル)] > [New (新規)] > [Lightning Component (Lightning コンポーネント)] をクリックします。
- Lightning コンポーネントに
Books4EveryoneHome
という名前を付けます。 - コンポーネント設定セクションで、[Lightning Page (Lightning ページ)] を選択して [Submit (送信)] をクリックします。
- コンポーネントの内容を次のコードで置き換えます。
<aura:component implements="flexipage:availableForAllPageTypes" access="global"> <aura:attribute name="Books" type="Book__c" /> <lightning:card title="Books4Everyone Books"> <aura:set attribute="body"> TODO: Update this to display data! </aura:set> </lightning:card> </aura:component>
現時点ではコンポーネントの内容はシンプルです。書籍に関する情報を格納するための属性が 1 つと、Lightning カードにデータを表示するためのコードがあります。このバンドルはすぐ後で編集しますが、まずはコンポーネントにデータを入力するための Apex を記述する必要があります。
Apex クラスを作成する
次のステップは、要求されたデータを Books4Everyone から取得する Apex コントローラーを作成することです。
- 開発者コンソールで、[File (ファイル)] > [New (新規)] > [Apex Class (Apex クラス)] をクリックします。
- 新しい Apex クラスに
Books4EveryoneHomeController
という名前を付けます。 - Apex クラスの内容を次のコードに置き換えます。
public with sharing class Books4EveryoneHomeController { @AuraEnabled public static List<Book__c> getBooks() { return; //Your query here } }
- 今記述したコードの内容をざっと見てみましょう。先頭行は
@AuraEnabled
で、先ほど作成した Lightning コンポーネントからこの関数を呼び出せるようにします。次は関数の定義です。Book__c オブジェクトのリストを返すように指定しています。SOQL のクエリは常に sObject のリストを返しますので、これは重要です。SOQL クエリも記述しますので、まだコードは保存しません。Books4Everyone は、すべての書籍のタイトルと説明を表示します。そのための SQL クエリは次のとおりです。SELECT b.ID, b.Name, b.Description FROM Book b
作成中のコンポーネントにこのクエリを追加しても機能しません。ここまでの内容を整理しましょう。Book (書籍) は、インストールした未管理パッケージに含まれていた Salesforce のカスタムオブジェクトで、API 参照名は Book__c です。Id (ID) と Name (名前) は標準項目であるため、API 参照名はそれぞれ Id と Name です。Description (説明) はカスタム項目であるため、API 参照名は Description__c です。 - これで、新しい SOQL クエリで Apex クラスを更新するための情報が揃いました。
return; //Your query here
を次のコードで置き換えます。return [SELECT Id,Name,Description__c FROM Book__c];
- ファイルを保存します。これで最初の SOQL クエリが完成しました。
SQL は SOQL ではない
最初のクエリを変換したところで、よく質問される SQL と SOQL の違いをまとめた表を確認しましょう。
ほとんどの SQL バリエーション |
SOQL |
---|---|
DML のステートメント、トランザクション制御、SELECT ステートメントをサポートする |
SELECT ステートメントのみをサポートする |
SELECT * をサポートする (すべての列を含む) |
SELECT * をサポートしない (含める項目を指定するか、もしくは SELECT ステートメントで FIELDS(ALL)、FIELDS(STANDARD)、または FIELDS(CUSTOM) を使用する) |
left、right、inner、outer 構文を使用して記述する結合をサポートする |
親子構文を使用して記述する「リレーションクエリ」をサポートする |
テーブルリレーションをトラバース するためのドット表記をサポートしない |
テーブルリレーションをトラバース するためのドット表記をサポートする |
制限を受けない |
制限 (例: 返される行数、ヒープなど) を受ける |
データを表示するように Lightning コンポーネントを更新する
データを取得するためのクエリを作成しましたので、次はそのデータが表示されるようにしましょう。コンポーネントをそのように更新します。
- 開発者コンソールで Books4EveryoneHome Lightning コンポーネントに戻ります。
- コンポーネントを次のように更新します。
<aura:component implements="flexipage:availableForAllPageTypes" access="global" controller="Books4EveryoneHomeController"> <aura:attribute name="Books" type="Book__c" /> <aura:handler name="init" action="{!c.doInit}" value="{!this}"/> <lightning:card title="Books4Everyone Books"> <aura:set attribute="body"> <table class="slds-table slds-table_bordered slds-table_cell-buffer"> <thead> <tr class="slds-text-title_caps"> <th scope="col">Book Titles</th> <th scope="col">Book Descriptions</th> </tr> </thead> <tbody> <aura:iteration items="{!v.Books}" var="books"> <tr scope="row"> <td> {!books.Name}</td> <td> {!books.Description__c}</td> </tr> </aura:iteration> </tbody> </table> </aura:set> </lightning:card> </aura:component>
前よりもかなり複雑になりました。最初の大きな変更は、controller=”Books4EveryoneHomeController”
でコントローラーをコンポーネントに追加したことです。これによってコンポーネントを Apex クラスに接続します。次の変更は、データを表示するためのテーブルを追加したことです。Book Titles (書籍のタイトル) と Book Descriptions (書籍の説明) という 2 つの列を追加し、aura:iteration
コンポーネントを使用して、Books から取得したデータを表示します。現時点ではこの aura 属性は空であるため、JavaScript コントローラーを更新して、Apex クラスから取得したデータを属性に格納する必要があります。 - ページの右側にある [Controller (コントローラー)] をクリックして、Lightning コンポーネント用のコントローラーを作成します。
- コントローラーの JavaScript を次のように更新します。
({ doInit: function(component, event, helper) { var action = component.get("c.getBooks"); action.setCallback(this, function(data) { component.set("v.Books", data.getReturnValue()); console.log(data.getReturnValue()); }); $A.enqueueAction(action); } })
これで aura 属性にデータが格納されました。このアクションは Apex 関数のgetBooks
を呼び出してBooks4EveryoneHome
コンポーネントのBooks
属性にデータを格納します。 - 開いているタブをすべて保存します。
コンポーネントの動作を確認する
クエリが想定どおりに機能するようにするための最後のステップは、作成したコンポーネントをホームページに追加することです。ではやってみましょう。
- 組織で Books4Everyone アプリケーションに移動します。
- [Home (ホーム)] をクリックします。
- 右上隅にある をクリックして [Edit Page (ページを編集)] をクリックします。
- Lightning アプリケーションビルダーの左側にあるカスタムコンポーネントのリストで Books4EveryoneHome を探します。
- このコンポーネントをページの左側にドラッグします。
- [Save (保存)] をクリックし、[Activate (有効化)] をクリックしてページを有効化してから、[Assign as Org Default (組織のデフォルトとして割り当て)] を選択して [Save (保存)] をクリックします。
- をクリックしてホームページに戻ります。
- 最後のステップとして、ホームページでデータを確認します。次のように表示されます。