ORM в Битрикс: что это такое и как с ним работать
ОглавлениеЧто такое ORMПреимущества ORM в БитриксОсновные классы ORMПолучение одного пользователяПолучение списка пользователейФильтрация данныхОператоры фильтрации ORMДобавление записи через ORMОбновление данныхУдаление записиПолучение количества записейРабота с собственными таблицамиJOIN в ORM БитриксRuntime-поляORM и инфоблокиТипичные ошибки при работе с ORMКогда использовать ORMЗаключение
Современная разработка на платформе 1С-Битрикс все чаще использует D7 API и ORM вместо устаревших методов работы с базой данных. ORM позволяет получать, изменять и удалять данные без написания SQL-запросов, что делает код более безопасным, понятным и удобным для поддержки.
В этой статье подробно рассмотрим, что такое ORM в Битрикс, как оно работает и как использовать его на практике с примерами кода.
Что такое ORM
ORM (Object-Relational Mapping) — это технология объектно-реляционного отображения, которая позволяет работать с данными базы данных через PHP-классы и объекты. Вместо SQL-запроса:SELECT * FROM b_user WHERE ID = 1
используется PHP-код:
UserTable::getById(1);
ORM самостоятельно формирует SQL-запрос и возвращает результат в удобном формате.
Преимущества ORM в Битрикс
Использование ORM дает множество преимуществ:- удобная работа с данными;
- меньше SQL-кода;
- защита от SQL-инъекций;
- поддержка связей между таблицами;
- удобная фильтрация и сортировка;
- высокая читаемость кода;
- совместимость с D7 API.
Основные классы ORM
Большинство таблиц системы имеют собственные ORM-классы. Например:Bitrix\Main\UserTable
Bitrix\Iblock\ElementTable
Bitrix\Main\GroupTable
Bitrix\Main\FileTable
Перед использованием необходимо подключить нужный класс:
use Bitrix\Main\UserTable;
Получение одного пользователя
Самый простой пример — получение пользователя по ID.use Bitrix\Main\UserTable;
$user = UserTable::getById(1)->fetch();
echo $user['LOGIN'];
После выполнения запроса в переменной $user будет массив с данными пользователя.
Получение списка пользователей
ORM позволяет получать сразу несколько записей.use Bitrix\Main\UserTable;
$result = UserTable::getList([
'select' => ['ID', 'LOGIN', 'EMAIL'],
'filter' => ['ACTIVE' => 'Y'],
'order' => ['ID' => 'DESC']
]);
while ($user = $result->fetch()) {
echo $user['LOGIN'] . '<br>';
}
Данный запрос вернет всех активных пользователей.
Фильтрация данных
Для отбора записей используется параметрfilter.
Примеры:
По ID
'filter' => ['ID' => 15]
По логину
'filter' => ['LOGIN' => 'admin']
По нескольким значениям
'filter' => [
'ACTIVE' => 'Y',
'=GROUPS.GROUP_ID' => 1
]
По диапазону дат
'filter' => [
'>=DATE_REGISTER' => '01.01.2025',
'<=DATE_REGISTER' => '31.12.2025'
]
ORM поддерживает десятки операторов фильтрации.
Операторы фильтрации ORM
Наиболее используемые операторы:| Оператор | Значение |
|---|---|
| = | равно |
| != | не равно |
| > | больше |
| < | меньше |
| >= | больше или равно |
| <= | меньше или равно |
| % | содержит |
| !% | не содержит |
| @ | входит в массив |
| !@ | не входит в массив |
'filter' => [
'%EMAIL' => '@gmail.com'
]
Добавление записи через ORM
Для создания новой записи используется методadd().
Пример добавления пользователя:
use Bitrix\Main\UserTable;
$result = UserTable::add([
'LOGIN' => 'testuser',
'EMAIL' => 'test@example.com',
'ACTIVE' => 'Y'
]);
Однако для пользователей рекомендуется использовать класс CUser, поскольку он выполняет дополнительную обработку паролей и системных полей.
Наиболее часто ORM применяется для собственных таблиц.
Обновление данных
Изменение записи выполняется методомupdate().
use Bitrix\Main\UserTable;
UserTable::update(
15,
[
'EMAIL' => 'newmail@example.com'
]
);
Где:
- 15 — ID записи;
- массив содержит изменяемые поля.
Удаление записи
Для удаления используется методdelete().
use Bitrix\Main\UserTable;
UserTable::delete(15);
После выполнения запись будет удалена из базы данных.
Следует использовать данный метод с осторожностью.
Получение количества записей
Иногда требуется узнать количество элементов.$count = UserTable::getCount([
'ACTIVE' => 'Y'
]);
echo $count;
Это значительно удобнее, чем писать отдельный SQL-запрос.
Работа с собственными таблицами
Одно из главных преимуществ ORM — возможность создавать собственные сущности. Пример класса:namespace Local\ORM;
use Bitrix\Main\ORM\Data\DataManager;
use Bitrix\Main\ORM\Fields\IntegerField;
use Bitrix\Main\ORM\Fields\StringField;
class ProductTable extends DataManager
{
public static function getTableName()
{
return 'local_products';
}
public static function getMap()
{
return [
new IntegerField('ID', [
'primary' => true,
'autocomplete' => true
]),
new StringField('NAME'),
new StringField('ARTICLE')
];
}
}
Теперь можно выполнять запросы:
use Local\ORM\ProductTable;
$list = ProductTable::getList()->fetchAll();
JOIN в ORM Битрикс
ORM поддерживает связи между таблицами через ReferenceField. Пример:new Reference(
'USER',
UserTable::class,
['=this.CREATED_BY' => 'ref.ID']
)
После этого можно получать связанные данные в одном запросе.
'select' => [
'ID',
'NAME',
'USER.LOGIN'
]
Это аналог SQL JOIN.
Runtime-поля
Иногда необходимо добавить вычисляемое поле прямо в запрос. Пример:'runtime' => [
new ExpressionField(
'FULL_NAME',
"CONCAT(%s,' ',%s)",
['NAME', 'LAST_NAME']
)
]
Теперь можно получить:
echo $item['FULL_NAME'];
без дополнительной обработки в PHP.
ORM и инфоблоки
Начиная с современных версий Битрикс, многие сущности инфоблоков также поддерживают ORM. Например:use Bitrix\Iblock\ElementTable;
$list = ElementTable::getList([
'select' => ['ID', 'NAME']
]);
Однако для работы со свойствами инфоблоков часто продолжают использовать:
CIBlockElement
или сгенерированные ORM-классы элементов.
Типичные ошибки при работе с ORM
Unknown parameter
Ошибка возникает при неправильном указании параметров запроса. Например:[
'>=DATE_CREATE' => $date
]
должно находиться внутри массива filter.
Правильно:
[
'filter' => [
'>=DATE_CREATE' => $date
]
]
Не найден класс
Необходимо проверить:Loader::includeModule('iblock');
или правильность namespace.
Пустой результат
Следует убедиться:- что данные существуют;
- правильно указаны поля;
- корректно настроены фильтры.
Когда использовать ORM
ORM рекомендуется применять в следующих случаях:- разработка новых модулей;
- создание собственных таблиц;
- сложные выборки данных;
- интеграции с внешними сервисами;
- работа с D7 API.