Appearance
Создание ORM класса для любой таблицы в БД
Несмотря на наличие D7, некоторые таблицы по прежнему отсутсвуют в ядре. Для того, чтобы можно было работать с таблицей, ее необходимо добавить в проект.
Для этого у битрикса существует специальный инструмент автогенерации класса таблицы. Например, таблица со значениями списка пользовательских свойств UF_* b_user_field_enum.
Рассмотрим каким образом работать с этой таблицей в ORM.
- Переходим в список всех таблиц
/bitrix/admin/perfmon_tables.php?lang=ru - Добавляем к url параметр
orm=y=>/bitrix/admin/perfmon_tables.php?lang=ru&orm=y - Теперь, если кликнуть на "бургер" рядом с названием у каждой таблицы появился пункт ORM

- Кликаем на него => система автоматически сгереирует класс с необходимыми полями
- Копируем получившийся код, переносим в проект (Например в файл
/local/php_interface/classes/Bitrix/User/FieldEnumTable.php) - В файле
/local/php_interface/init.phpподключим автозагрузку таких таблиц
php
spl_autoload_register('loadBitrixTables');
function loadBitrixTables(string $strClassName): void
{
$strPrefix = "Bitrix\\";
$iPrefixLength = strlen($strPrefix);
if (strncmp($strPrefix, $strClassName, $iPrefixLength) === 0) {
$strFilePath = str_replace('\\', DIRECTORY_SEPARATOR, __DIR__.DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR . $strClassName . '.php');
if (file_exists($strFilePath)) {
require_once $strFilePath;
}
}
}- Теперь мы можем подключать данную таблицу в запросы в виде
\Bitrix\User\FieldEnumTable
php
<?php
namespace Bitrix\User;
use Bitrix\Main\Localization\Loc,
Bitrix\Main\ORM\Data\DataManager,
Bitrix\Main\ORM\Fields\BooleanField,
Bitrix\Main\ORM\Fields\IntegerField,
Bitrix\Main\ORM\Fields\StringField,
Bitrix\Main\ORM\Fields\Validators\LengthValidator;
Loc::loadMessages(__FILE__);
/**
* Class FieldEnumTable
*
* Fields:
* <ul>
* <li> ID int mandatory
* <li> USER_FIELD_ID int optional
* <li> VALUE string(255) mandatory
* <li> DEF bool ('N', 'Y') optional default 'N'
* <li> SORT int optional default 500
* <li> XML_ID string(255) mandatory
* </ul>
*
* @package Bitrix\User
**/
class FieldEnumTable extends DataManager
{
/**
* Returns DB table name for entity.
*
* @return string
*/
public static function getTableName()
{
return 'b_user_field_enum';
}
/**
* Returns entity map definition.
*
* @return array
*/
public static function getMap()
{
return [
new IntegerField(
'ID',
[
'primary' => true,
'autocomplete' => true,
'title' => Loc::getMessage('FIELD_ENUM_ENTITY_ID_FIELD')
]
),
new IntegerField(
'USER_FIELD_ID',
[
'title' => Loc::getMessage('FIELD_ENUM_ENTITY_USER_FIELD_ID_FIELD')
]
),
new StringField(
'VALUE',
[
'required' => true,
'validation' => [__CLASS__, 'validateValue'],
'title' => Loc::getMessage('FIELD_ENUM_ENTITY_VALUE_FIELD')
]
),
new BooleanField(
'DEF',
[
'values' => array('N', 'Y'),
'default' => 'N',
'title' => Loc::getMessage('FIELD_ENUM_ENTITY_DEF_FIELD')
]
),
new IntegerField(
'SORT',
[
'default' => 500,
'title' => Loc::getMessage('FIELD_ENUM_ENTITY_SORT_FIELD')
]
),
new StringField(
'XML_ID',
[
'required' => true,
'validation' => [__CLASS__, 'validateXmlId'],
'title' => Loc::getMessage('FIELD_ENUM_ENTITY_XML_ID_FIELD')
]
),
];
}
/**
* Returns validators for VALUE field.
*
* @return array
*/
public static function validateValue()
{
return [
new LengthValidator(null, 255),
];
}
/**
* Returns validators for XML_ID field.
*
* @return array
*/
public static function validateXmlId()
{
return [
new LengthValidator(null, 255),
];
}
}