Apex-SOQL

これは、SFDCデータベースと連携するように設計されたSalesforceオブジェクトクエリ言語です。単一のsObjectでのみ、指定された基準でレコードを検索できます。

SOSLと同様に、複数のオブジェクトを検索することはできませんが、ネストされたクエリをサポートします。

SOQLの例

化学会社の継続的な例を考えてみましょう。今日作成され、顧客名が「test」ではないレコードのリストが必要だとします。この場合、以下に示すようにSOQLクエリを使用する必要があります-

// fetching the Records via SOQL
List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
InvoiceList = [SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM
   APEX_Invoice__c WHERE createdDate = today AND APEX_Customer__r.Name != 'Test'];
// SOQL query for given criteria

// Printing the fetched records
System.debug('We have total '+InvoiceList.size()+' Records in List');

for (APEX_Invoice__c objInvoice: InvoiceList) {
   System.debug('Record Value is '+objInvoice); 
   // Printing the Record fetched
}

以下に示すように、開発者コンソールのクエリエディタを介してSOQLクエリを実行できます。

開発者コンソールで以下のクエリを実行します。今日作成された請求書レコードを検索します。

SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM APEX_Invoice__c
   WHERE createdDate = today

値が必要なフィールドを選択する必要があります。そうしないと、実行時エラーがスローされる可能性があります。

関係フィールドのトラバース

これは、親子オブジェクトの関係を何度もトラバースする必要があるため、SFDCで最も重要な部分の1つです。

また、データベースに2つの関連オブジェクトレコードを挿入する必要がある場合もあります。たとえば、InvoiceオブジェクトはCustomerオブジェクトと関係があるため、1人のCustomerが多数の請求書を持つことができます。

請求書を作成していて、この請求書を顧客に関連付ける必要があるとします。この機能には次のコードを使用できます-

// Now create the invoice record and relate it with the Customer object
// Before executing this, please create a Customer Records with Name 'Customer
// Creation Test'
APEX_Invoice__c objInvoice = new APEX_Invoice__c();

// Relating Invoice to customer via id field of Customer object
objInvoice.APEX_Customer__c = [SELECT id FROM APEX_Customer__c WHERE Name =
   'Customer Creation Test' LIMIT 1].id;
objInvoice.APEX_Status__c = 'Pending';
insert objInvoice;  //Creating Invoice
System.debug('Newly Created Invoice'+objInvoice);  //Newly created invoice

開発者コンソールでこのコードスニペットを実行します。実行したら、開発者コンソールから請求書のIDをコピーし、次に示すようにSFDCで同じものを開きます。以下に示すように、親レコードがすでに請求書レコードに割り当てられていることがわかります。

子レコードの取得

ここで、特定の顧客レコードに関連するすべての請求書を1か所にまとめる必要がある例を考えてみましょう。このためには、子関係の名前を知っている必要があります。子関係の名前を確認するには、子オブジェクトのフィールド詳細ページに移動し、「子関係」の値を確認します。この例では、最後に__rが追加された請求書です。

この例では、データを設定し、「ABC Customer」レコードという名前の顧客を作成してから、その顧客に3つの請求書を追加する必要があります。

次に、顧客「ABC顧客」が持っている請求書を取得します。以下は同じのクエリです-

// Fetching Child Records using SOQL
List<apex_customer__c> ListCustomers = [SELECT Name, Id, 
   (SELECT id, Name FROM Invoices__r) FROM APEX_Customer__c WHERE Name = 'ABC Customer'];

// Query for fetching the Child records along with Parent
System.debug('ListCustomers '+ListCustomers); // Parent Record

List<apex_invoice__c> ListOfInvoices = ListCustomers[0].Invoices__r;
// By this notation, you could fetch the child records and save it in List
System.debug('ListOfInvoices values of Child '+ListOfInvoices);
// Child records

レコード値はデバッグログで確認できます。

親レコードの取得

作成日が今日である請求書の顧客名を取得する必要があるとします。次に、同じように以下のクエリを使用できます。

親レコードの値を子オブジェクトとともに取得します。

// Fetching Parent Record Field value using SOQL
List<apex_invoice__c> ListOfInvoicesWithCustomerName = new List<apex_invoice__c>();
ListOfInvoicesWithCustomerName = [SELECT Name, id, APEX_Customer__r.Name 
   FROM APEX_Invoice__c LIMIT 10];

// Fetching the Parent record's values
for (APEX_Invoice__c objInv: ListOfInvoicesWithCustomerName) {
   System.debug('Invoice Customer Name is '+objInv.APEX_Customer__r.Name);
   // Will print the values, all the Customer Records will be printed
}

ここでは、APEX_Customer__r.Nameという表記を使用しました。APEX_Customer__rは親関係の名前です。ここでは、Parentフィールドの最後に__rを追加する必要があります。その後、親フィールドの値を取得できます。

集計関数

SOQLには、SQLの場合と同様に集計関数があります。集計関数を使用すると、データをロールアップして要約できます。関数を詳しく理解しましょう。

顧客「ABC顧客」から得られる平均収益を知りたい場合は、この関数を使用して平均を取得できます。

// Getting Average of all the invoices for a Perticular Customer
AggregateResult[] groupedResults = [SELECT
   AVG(APEX_Amount_Paid__c)averageAmount FROM APEX_Invoice__c WHERE
   APEX_Customer__r.Name = 'ABC Customer'];
Object avgPaidAmount = groupedResults[0].get('averageAmount');
System.debug('Total Average Amount Received From Customer ABC is '+avgPaidAmount);

デバッグログの出力を確認します。集計関数を含むクエリは、結果を次の配列で返すことに注意してください。AggregateResultオブジェクト。AggregateResultは読み取り専用のsObjectであり、クエリ結果にのみ使用されます。大規模なデータに関するレポートを生成する必要がある場合に役立ちます。

データの要約を実行するために使用できる他の集計関数もあります。

MIN() −これは最小値を見つけるために使用できます

MAX() −これは最大値を見つけるために使用できます。

Apex変数のバインド

SOQLクエリでApex変数を使用して、目的の結果をフェッチできます。頂点変数は、コロン(:)表記で参照できます。

// Apex Variable Reference
String CustomerName = 'ABC Customer';
List<apex_customer__c> ListCustomer = [SELECT Id, Name FROM APEX_Customer__c
   WHERE Name = :CustomerName];

// Query Using Apex variable
System.debug('ListCustomer Name'+ListCustomer); // Customer Name