Как создать ORM классы в Битрикс?

В этой статье мы рассмотрим как создать ORM класс для любой таблицы Битрикса. Никому не секрет, что методы ядра D7 работают значительно быстрее. Разрабатывать с их помощью гораздо проще, так как все операции однотипные, и по сравнению со старым ядром не требуется запоминать синтаксис, принципы работы и количество параметров.

Когда нужны ORM-классы

ORM классы чаще всего создаются для HL-блоков, иногда и для других таблиц, созданных вручную в MySQL.

Для системных сущностей, таких как товары, корзина, заказы и т.п. – уже есть готовые ORM-классы, например:

\Bitrix\Sale\Internals\BasketTable

\Bitrix\Sale\Internals\ProductTable

ORM-классы полезны, когда нужно ускорить работу с таблицей, стандартизировать код и сделать его проще. Но у таких классов есть недостаток – это сложность получения связанных сущностей. Например, в ORM классе корзины BasketTable нельзя получить свойства корзины или обновить их. Но это все решаемо – делается подзапросом или отдельным методом ORM класса BasketPropertyTable.

Генерация ORM класса

ORM-класс можно создать вручную по структуре таблицы базы данных или сгенерировать средствами Битрикса.

Для того, чтобы сгенерировать вручную нужно перейти в администраторской панели по пути Настройки / Производительность / Таблицы.

Добавить в адресную строку параметр orm=y. Часть ссылки должна выглядеть таким образом:

/bitrix/admin/perfmon_tables.php?lang=ru&orm=y

После перезагрузки в гамбургер-меню выбранной в списке таблицы появится пункт – ORM

Как создать ORM классы в Битрикс?

После нажатия на экране появится код класса:

Как создать ORM классы в Битрикс?

В этом сгенерированном коде определены методы getTableName, в который указывается название таблицы базы данных и getMap, в котором описывается структура таблицы. Это обязательные методы. Без них класс не заработает. Также название класса обязательно должно быть в с постфиксом Table, как на примере – TesthlTable

С этим кодом создается новый файл, например в /local/php_interface/classes/ с названием testhltable.php или, если у вас есть модуль с классами, то в /local/modules/ваш_класс/lib/orm/. Только не забываем поменять namespace класса.

Пример класса, сгенерированного данным способом:

<?php
namespace Bitrix\Testhl;
use Bitrix\Main,
Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);
/**
* Class TesthlTable
*
* Fields:
* <ul>
* <li> ID int mandatory
* <li> UF_NAME string optional
* <li> UF_HREF string optional
* </ul>
*
* @package Bitrix\Testhl
**/
class TesthlTable extends Main\Entity\DataManager
{
/**
* Returns DB table name for entity.
*
* @return string
*/
public static function getTableName()
{
return 'my_testhl';
}
/**
* Returns entity map definition.
*
* @return array
*/
public static function getMap()
{
return array(
'ID' => array(
'data_type' => 'integer',
'primary' => true,
'autocomplete' => true,
'title' => Loc::getMessage('TESTHL_ENTITY_ID_FIELD'),
),
'UF_NAME' => array(
'data_type' => 'text',
'title' => Loc::getMessage('TESTHL_ENTITY_UF_NAME_FIELD'),
),
'UF_HREF' => array(
'data_type' => 'text',
'title' => Loc::getMessage('TESTHL_ENTITY_UF_HREF_FIELD'),
),
);
}
}

Примеры использования ORM

Теперь, когда у нас есть ORM-класс, можно воспользоваться типизированными функциями. Например, CRUD-таблицы:

<?
use Bitrix\Testhl\TesthlTable;
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/header.php');
$map = TesthlTable::getMap();
$getList = TesthlTable::getList([
'filter' => [
'=ID' => 1,
],
]);
$resAdd = TesthlTable::add([
'UF_NAME' => 'Яндекс',
'UF_HREF' => 'ya.ru',
]);
$resUpd = TesthlTable::update(2, [
'UF_NAME' => 'New',
]);
$resDel = TesthlTable::delete(3);

Таким образом, можно реализовать свои ORM классы в Битриксе. ORM значительно быстрее работает и упрощает работу с сущностями. Рекомендуется для вручную созданных таблиц и HL-блоков.