DataManager в Битрикс: что это такое и как с ним работать
ОглавлениеЧто такое DataManagerДля чего используется DataManagerСтруктура ORM-сущностиМетод getTableName()Метод getMap()Полноценный пример DataManagerДобавление записиПолучение списка записейПолучение одной записиФильтрация данныхОбновление записиУдаление записиПодсчет количества записейВалидация полейСвязи между таблицамиСобытия DataManagerИспользование Query BuilderТипичные ошибки при работе с DataManagerКогда использовать DataManagerЗаключение
При разработке современных решений на платформе 1С-Битрикс все чаще используется D7 API и ORM. Одним из ключевых классов ORM является DataManager. Именно он служит основой для создания собственных сущностей и обеспечивает удобную работу с таблицами базы данных через объектный интерфейс.
С помощью DataManager разработчик может выполнять выборку, добавление, обновление и удаление данных без написания SQL-запросов вручную. В этой статье подробно рассмотрим возможности DataManager, его структуру и практические примеры использования.
Что такое DataManager
DataManager — это базовый класс ORM в Битрикс, который отвечает за работу с таблицами базы данных. Практически все ORM-сущности системы наследуются от класса:Bitrix\Main\ORM\Data\DataManager
Например:
Bitrix\Main\UserTable
Bitrix\Main\GroupTable
Bitrix\Main\FileTable
Bitrix\Iblock\ElementTable
Каждая ORM-сущность представляет отдельную таблицу базы данных.
Для чего используется DataManager
DataManager позволяет:- получать данные из таблиц;
- добавлять записи;
- обновлять записи;
- удалять данные;
- выполнять сложные ORM-запросы;
- создавать собственные сущности;
- работать со связями между таблицами.
Структура ORM-сущности
Любая ORM-сущность должна наследовать DataManager. Простейший пример:namespace Local\ORM;
use Bitrix\Main\ORM\Data\DataManager;
class ProductTable extends DataManager
{
}
Однако для полноценной работы необходимо описать таблицу и структуру полей.
Метод getTableName()
Метод определяет таблицу базы данных, с которой будет работать ORM. Пример:public static function getTableName()
{
return 'local_products';
}
Теперь ORM будет использовать таблицу:
local_products
для всех операций.
Метод getMap()
МетодgetMap() описывает структуру полей таблицы.
Пример:
use Bitrix\Main\ORM\Fields\IntegerField;
use Bitrix\Main\ORM\Fields\StringField;
public static function getMap()
{
return [
new IntegerField('ID', [
'primary' => true,
'autocomplete' => true
]),
new StringField('NAME'),
new StringField('ARTICLE')
];
}
Именно этот метод сообщает ORM, какие поля существуют в таблице.
Полноценный пример DataManager
Создадим сущность для хранения товаров.namespace Local\ORM;
use Bitrix\Main\ORM\Data\DataManager;
use Bitrix\Main\ORM\Fields\IntegerField;
use Bitrix\Main\ORM\Fields\StringField;
use Bitrix\Main\ORM\Fields\FloatField;
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'),
new FloatField('PRICE')
];
}
}
После этого можно работать с таблицей через ORM.
Добавление записи
Для создания новой записи используется методadd().
Пример:
use Local\ORM\ProductTable;
$result = ProductTable::add([
'NAME' => 'Ноутбук',
'ARTICLE' => 'NB-001',
'PRICE' => 79990
]);
Получение ID новой записи:
$id = $result->getId();
Получение списка записей
Для выборки используется методgetList().
Пример:
$list = ProductTable::getList([
'select' => [
'ID',
'NAME',
'PRICE'
],
'order' => [
'ID' => 'DESC'
]
]);
while ($item = $list->fetch())
{
print_r($item);
}
Получим список товаров из таблицы.
Получение одной записи
Получить запись по ID можно следующим образом:$product = ProductTable::getById(5)->fetch();
echo $product['NAME'];
Метод автоматически сформирует SQL-запрос по первичному ключу.
Фильтрация данных
Для фильтрации используется параметрfilter.
Пример:
$list = ProductTable::getList([
'filter' => [
'>PRICE' => 50000
]
]);
Будут выбраны товары дороже 50 000 рублей.
Поиск по названию:
'filter' => [
'%NAME' => 'Ноутбук'
]
Аналог SQL:
WHERE NAME LIKE '%Ноутбук%'
Обновление записи
Для изменения данных применяется методupdate().
Пример:
ProductTable::update(
5,
[
'PRICE' => 69990
]
);
Где:
- 5 — ID записи;
- массив содержит новые значения полей.
Удаление записи
Для удаления используется методdelete().
Пример:
ProductTable::delete(5);
После выполнения запись будет удалена из базы данных.
Перед удалением рекомендуется проверять наличие связанных данных.
Подсчет количества записей
Получить количество записей можно через методgetCount().
$count = ProductTable::getCount([
'>PRICE' => 10000
]);
echo $count;
Метод возвращает количество элементов, соответствующих фильтру.
Валидация полей
DataManager позволяет выполнять проверку данных. Пример:use Bitrix\Main\ORM\Fields\Validators\LengthValidator;
new StringField('NAME', [
'required' => true,
'validation' => function () {
return [
new LengthValidator(null, 255)
];
}
])
Теперь поле станет обязательным для заполнения.
Связи между таблицами
ORM поддерживает связи через Reference. Пример:use Bitrix\Main\ORM\Fields\Relations\Reference;
use Bitrix\Main\UserTable;
new Reference(
'USER',
UserTable::class,
['=this.CREATED_BY' => 'ref.ID']
)
После этого можно получать данные пользователя в одном запросе.
'select' => [
'ID',
'NAME',
'USER.LOGIN'
]
Это аналог SQL JOIN.
События DataManager
Для обработки действий над данными доступны события. Наиболее популярные:- onBeforeAdd
- onAfterAdd
- onBeforeUpdate
- onAfterUpdate
- onBeforeDelete
- onAfterDelete
public static function onBeforeAdd($event)
{
$fields = $event->getParameter('fields');
}
События позволяют автоматически выполнять дополнительную бизнес-логику.
Использование Query Builder
Каждая сущность DataManager поддерживает Query Builder. Пример:$query = ProductTable::query();
$query
->setSelect(['ID', 'NAME'])
->setFilter([
'>PRICE' => 10000
]);
$result = $query->exec();
Это позволяет строить сложные ORM-запросы без SQL.
Типичные ошибки при работе с DataManager
Unknown field definition
Ошибка означает, что в запросе указано поле, отсутствующее вgetMap().
Необходимо проверить структуру сущности.
Table not found
Причина — неверное название таблицы в методе:getTableName()
Empty result
Следует проверить:- наличие данных;
- правильность фильтра;
- соответствие структуры таблицы и ORM-класса.
ORM не видит новый класс
Необходимо убедиться, что:- подключен автозагрузчик;
- используется корректный namespace;
- файл расположен в правильной директории.
Когда использовать DataManager
DataManager рекомендуется применять в следующих случаях:- разработка собственных модулей;
- создание кастомных таблиц;
- интеграции с внешними сервисами;
- хранение служебных данных;
- реализация сложной бизнес-логики;
- разработка на D7 API.