Это язык запросов Salesforce, разработанный для работы с базой данных SFDC. Он может искать запись по заданному критерию только в одном 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, так как много раз нам нужно проходить через отношения родительского дочернего объекта
Также могут быть случаи, когда вам нужно вставить две записи связанных объектов в базу данных. Например, объект Invoice связан с объектом Customer и, следовательно, один 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
Выполните этот фрагмент кода в консоли разработчика. После выполнения скопируйте идентификатор счета-фактуры из консоли разработчика, а затем откройте его в SFDC, как показано ниже. Вы можете видеть, что родительская запись уже была назначена записи счета, как показано ниже.
Извлечение записей о детях
Давайте теперь рассмотрим пример, в котором все счета, связанные с конкретной записью клиента, должны быть в одном месте. Для этого вы должны знать имя дочернего отношения. Чтобы увидеть имя дочернего отношения, перейдите на страницу сведений о поле дочернего объекта и проверьте значение «Дочерние отношения». В нашем примере это счета, добавленные __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 — это имя родительского отношения, здесь вы должны добавить __r в конце поля Parent, а затем вы можете получить значение родительского поля.
Агрегатные функции
У 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 можно ссылаться с помощью двоеточия (:).