Apex - SOQL

Đây là Ngôn ngữ Truy vấn Đối tượng Salesforce được thiết kế để hoạt động với Cơ sở dữ liệu SFDC. Nó có thể tìm kiếm một bản ghi trên một tiêu chí nhất định chỉ trong một sObject.

Giống như SOSL, nó không thể tìm kiếm trên nhiều đối tượng nhưng nó hỗ trợ các truy vấn lồng nhau.

Ví dụ SOQL

Hãy xem xét ví dụ hiện tại của chúng tôi về Công ty Hóa chất. Giả sử, chúng ta cần một danh sách các bản ghi được tạo ngày hôm nay và tên khách hàng không phải là 'thử nghiệm'. Trong trường hợp này, chúng tôi sẽ phải sử dụng truy vấn SOQL như được đưa ra bên dưới:

// 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
}

Bạn có thể chạy truy vấn SOQL thông qua Trình soạn thảo truy vấn trong Bảng điều khiển dành cho nhà phát triển như được hiển thị bên dưới.

Chạy truy vấn được cung cấp bên dưới trong Bảng điều khiển dành cho nhà phát triển. Tìm kiếm các bản ghi Hóa đơn được tạo ngày hôm nay.

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

Bạn phải chọn các trường mà bạn cần các giá trị, nếu không, nó có thể gây ra lỗi thời gian chạy.

Chuyển ngang các trường quan hệ

Đây là một trong những phần quan trọng nhất trong SFDC vì nhiều lần chúng ta cần xem qua mối quan hệ đối tượng con chính

Ngoài ra, có thể có trường hợp khi bạn cần chèn hai bản ghi đối tượng liên kết trong Cơ sở dữ liệu. Ví dụ, đối tượng Hóa đơn có mối quan hệ với đối tượng Khách hàng và do đó một Khách hàng có thể có nhiều hóa đơn.

Giả sử, bạn đang tạo hóa đơn và sau đó bạn cần liên kết hóa đơn này với Khách hàng. Bạn có thể sử dụng mã sau cho chức năng này -

// 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

Thực thi đoạn mã này trong Bảng điều khiển dành cho nhà phát triển. Sau khi thực hiện, hãy sao chép Id hóa đơn từ Bảng điều khiển dành cho nhà phát triển và sau đó mở mã hóa đơn đó trong SFDC như được hiển thị bên dưới. Bạn có thể thấy rằng bản ghi Gốc đã được gán cho bản ghi Hóa đơn như hình dưới đây.

Tìm nạp bản ghi con

Bây giờ chúng ta hãy xem xét một ví dụ trong đó, tất cả các hóa đơn liên quan đến hồ sơ khách hàng cụ thể cần phải ở một nơi. Đối với điều này, bạn phải biết tên mối quan hệ con. Để xem tên quan hệ con, hãy chuyển đến trang chi tiết trường trên đối tượng con và kiểm tra giá trị "Mối quan hệ con". Trong ví dụ của chúng tôi, đó là các hóa đơn được thêm vào bởi __r ở cuối.

Thí dụ

Trong ví dụ này, chúng tôi sẽ cần thiết lập dữ liệu, tạo một khách hàng có tên là bản ghi 'Khách hàng ABC' và sau đó thêm 3 hóa đơn cho khách hàng đó.

Bây giờ, chúng tôi sẽ tìm nạp các hóa đơn mà Khách hàng 'Khách hàng ABC' có. Sau đây là truy vấn cho cùng -

// 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

Bạn có thể xem các giá trị Bản ghi trong Nhật ký gỡ lỗi.

Tìm nạp bản ghi gốc

Giả sử, bạn cần tìm nạp Tên khách hàng của hóa đơn vào ngày tạo là hôm nay, sau đó bạn có thể sử dụng truy vấn được cung cấp bên dưới cho tương tự -

Thí dụ

Tìm nạp giá trị của bản ghi gốc cùng với đối tượng con.

// 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
}

Ở đây chúng tôi đã sử dụng ký hiệu APEX_Customer__r.Name, trong đó APEX_Customer__r là tên quan hệ mẹ, ở đây bạn phải thêm __r vào cuối trường Cha và sau đó bạn có thể tìm nạp giá trị trường mẹ.

Chức năng tổng hợp

SOQL có chức năng tổng hợp như chúng ta có trong SQL. Các hàm tổng hợp cho phép chúng ta cuộn lại và tóm tắt dữ liệu. Bây giờ chúng ta hãy hiểu chức năng một cách chi tiết.

Giả sử bạn muốn biết doanh thu trung bình mà chúng tôi nhận được từ Khách hàng 'Khách hàng ABC' là bao nhiêu, thì bạn có thể sử dụng hàm này để tính mức trung bình.

Thí dụ

// 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);

Kiểm tra đầu ra trong Nhật ký gỡ lỗi. Lưu ý rằng bất kỳ truy vấn nào bao gồm một hàm tổng hợp đều trả về kết quả của nó trong một mảngAggregateResultcác đối tượng. AggregateResult là một sObject chỉ đọc và chỉ được sử dụng cho các kết quả truy vấn. Nó rất hữu ích khi chúng ta cần tạo Báo cáo về dữ liệu lớn.

Cũng có các hàm tổng hợp khác mà bạn có thể được sử dụng để thực hiện tóm tắt dữ liệu.

MIN() - Điều này có thể được sử dụng để tìm giá trị nhỏ nhất

MAX() - Điều này có thể được sử dụng để tìm giá trị lớn nhất.

Các biến Apex ràng buộc

Bạn có thể sử dụng biến Apex trong truy vấn SOQL để tìm nạp kết quả mong muốn. Các biến Apex có thể được tham chiếu bởi ký hiệu Colon (:).

Thí dụ

// 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