Построение путей к колонкам относительно корневой схемы. Примеры
Отправной точкой механизма построения запроса EntitySchemaQuery является корневая схема и принцип обратной связи (подробнее об этом в статье Использование EntitySchemaQuery для построения запросов к базе данных).
Для того, чтобы в запрос добавить колонку из произвольной таблицы по обратным связям, необходимо корректно построить путь к этой колонке. Ниже рассмотрены различные варианты добавления колонок в запрос и примеры формирования имени к колонке в каждом варианте.
1) Колонка корневой схемы
В этом случае имя колонки строится как [Имя колонки в корневой схеме].
- Корневая схема: Contact
- Пример: колонка с адресом контакта
- Имя колонки: Address
- Пример создания запроса EntitySchemaQuery, возвращающего значения этой колонки:
Пример 1
// Создаем экземпляр класса [EntitySchemaQuery] с корневой схемой [Contact]. var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" }); // Добавляем колонку [Address], задаем для нее псевдоним [Address]. esq.addColumn("Address", "Address");
2) Колонка схемы, на которую ссылается колонка-справочник текущей схемы
Имя колонки строится по принципу [Имя колонки-справочника].[Имя колонки схемы, на которую ссылается справочник].
При этом в результирующем запросе к корневой схеме City оператором JOIN (по умолчанию – LEFT OUTER JOIN) будет присоединена схема Country. Условие присоединения (условие ON оператора JOIN) формируется по следующему принципу:
[Имя присоединяемой схемы].[Id] = [Имя корневой схемы].[Имя колонки, которая ссылается на присоединяемую схему + Id]
В общем случае можно продолжать построение цепочки обратных связей далее.
- Корневая схема: Contact
- Пример: колонка с названием контрагента, колонка с именем основного контакта у контрагента
- Имена колонок: Account.Name, Account.PrimaryContact.Name
- Пример создания запроса EntitySchemaQuery, возвращающего значения этих колонок:
Пример 2
// Создаем экземпляр класса [EntitySchemaQuery] с корневой схемой [Contact]. var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" }); // Добавляем колонку-справочник [Account]. // Затем добавляем колонку [Name] из схемы [Account], // на которую ссылается колонка-справочник [Account], и задаем для нее псевдоним [AccountName]. esq.addColumn("Account.Name", "AccountName"); // Добавляем колонку-справочник [Account]. // Затем добавляем колонку-справочник [PrimaryContact] из схемы [Account], // на которую ссылается колонка-справочник [Account]. // Затем добавляем колонку [Name] из схемы [Contact], // на которую ссылается колонка-справочник [PrimaryContact], и задаем для нее псевдоним [PrimaryContactName]. esq.addColumn("Account.PrimaryContact.Name", "PrimaryContactName");
3) Колонка схемы по произвольному внешнему ключу
Имя колонки строится по принципу [Имя_присоединяемой_схемы:Имя_колонки_для_связи_присоединяемой_схемы:Имя_колонки_для_связи_текущей_схемы].
Если в качестве колонки для связи у текущей схемы выступает колонка Id, то в этом случае ее можно опустить, то есть имя колонки будет выглядеть следующим образом:
[Имя_присоединяемой_схемы:Имя_колонки_для_связи_присоединяемой_схемы].
В общем случае можно строить имена колонок по цепочкам обратных связей произвольной длины.
- Пример: колонка с именем контакта, который добавил город
- Имя колонки: [Contact:Id:CreatedBy].Name
- Пример создания запроса EntitySchemaQuery, возвращающего значения этой колонки:
Пример 3
// Создаем экземпляр класса [EntitySchemaQuery] с корневой схемой [Contact]. var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" }); // Присоединяем к корневой схеме еще одну схему [Contact] по колонке [Owner] // и выбираем из нее колонку [Name]. Задаем для нее псевдоним [OwnerName]. esq.addColumn("[Contact:Id:Owner].Name", "OwnerName"); // К колонке типа справочник [Account] присоединяем схему [Contact] по колонке [PrimaryContact] // и выбираем из нее колонку [Name]. // Задаем для нее псевдоним [PrimaryContactName]. esq.addColumn("Account.[Contact:Id:PrimaryContact].Name", "PrimaryContactName");