Как создать 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
После нажатия на экране появится код класса:
В этом сгенерированном коде определены методы 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-блоков.