ORM-система в «Битрикс» |
Сегодня я расскажу про такую составляющую системы «1С-Битрикс: Управление сайтом ASP.NET», как сущности. Этот механизм — один из основополагающих механизмов системы, претерпел значительные изменения к 4-й версии. Немного истории
здесь мы выбираем комментарии для поста в блоге в определенном интервале и сортируем их в нужном порядке.
Первым аргументом GetList'а идет фильтр. Фильтры бывают разными. Атомарным фильтром является является фильтр «поле равно значение» — он олицетворен классом BXFilterItem. Еще есть фильтр AND (BXFilter) и OR (BXFilterOr). В этом примере мы выбираем те комментарии, у которых LiveRootNodeIndex лежит в диапазоне от 4 до 7, а идентификатор связанной сущности BXBlogPost равен 256.
Второй аргумент — это порядок сортировки — тут все просто, задаем парами вида поле-направление.
Третий аргумент — еще одна мощная вещь — это выборка. При помощи BXSelect можно указать список полей, которые нужно выбрать в запросе, а также полей связанных сущностей (API автоматически сделает нужные JOIN'ы). Таким образом мы, например, для каждого комментария можем выбрать дополнительно нужную информацию о его авторе и о блоге автора. Все это будет сделано в рамках одного запроса. Конечно, мы можем не указывать дополнительных сущностей в выборке — к ним все равно можно будет обратиться через свойства комментария, но уже с дополнительным запросом по требованию. В нашем случае мы дополнительно выбираем (BXSelectAdd означает, что перечисленные поля и сущности будут выбраны дополнительно к основной) 2 поля из связанной сущности AuthorBlog (блог автора) — идентификатор и адрес, и список идентификаторов сайтов, к которым принадлежат категории, к которым принадлежит все тот же блог автора комментария. Т.е. API позволяет нам сделать глубокую выборку связанных данных. Даже множественных. Ну и в добавок нам понадобится информация об авторе комментария и его аватар — это уже конкретные сущности (BXBlogUser, BXUser, BXFile) — они будут выбраны полностью, со всеми полями.
Обратите внимание, что поля сущности задаются не строками, а свойствами объекта BXBlogComment.Fields — схемы сущности. Схема сущности описывается отдельным классом и содержит поля сущности и их привязку к базе данных. Поля могут описывать простые свойства, имеющие прямые прототипы в базе данных (BXTableField), выражения, чья логика отображения задается кодом (BXCalculatedField), одиночные и множественные связки с другими сущностями (BXSchemeField, BXLinkedField).
Таким образом общение с сущностями происходит на уровне .NET кода, а не SQL — тем самым минимизируется вероятность ошибки, ведь корректность синтаксиса теперь за нас проверяет компилятор, а отсутствие прямых вставок SQL-кода защищает нас от различных дыр в безопасности.
В ходе разработки сайта или модуля разработчикам, возможно, придется столкнуться со следующими задачами:
Описание сущности сводится к объявлению 3-х классов: схемы сущности, собственно сущности и класса коллекции
Класс схемы сущности наследуется от BXScheme и содержит в своем статическом конструкторе (на данный момент это особенность API) описания полей, а также предоставляет доступ к полям через свойства. Например, схема Вашей сущности может выглядеть следующим образом:
Класс сущности наследуется от BXEntity и содержит в себе описание свойств сущности и пользовательскую бизнес-логику. В самом простом случае это будет выглядеть так:
Класс коллекции — на данном этапе это просто обертка и описывается одной строкой:
Таким образом для типовых сущностей задача описания носит действительно описательный характер. А с написанием кода может справиться, например, какой-нибудь кодогенератор. :)
Для более сложной логики класс сущности содержит набор виртуальных и шаблонных методов, которые можно переопределить в зависимости от сложности встраиваемого поведения.
Для критичных операций можно написать методы с прямыми SQL запросами — API сущностей позволяет создать сущность из голой SQL выборки SqlDataReader'ом.
В конечном итоге мы получаем унифицированный механизм для доступа к данным — все сущности имеют метод GetList, набор полей и типизированные свойства. Т.е. нам не придется задумываться, а как выбрать тот или иной объект по такому-то условию — методы выборки одинаковы для всех сущностей, а Visual Studio подскажет, какие поля или свойства есть у сущности.
API сущностей — это уже сложившийся механизм, который прошел «боевое крещение» инфоблоками, форумами и блогами, и призван избавить разработчика от необходимости писать рутинные SQL запросы для типовых задач, задействовать особенности статической типизации и использовать удобные средства, которые нам предлагает IDE. |