Skip to content

Создание ORM класса для любой таблицы в БД

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

Для этого у битрикса существует специальный инструмент автогенерации класса таблицы. Например, таблица со значениями списка пользовательских свойств UF_* b_user_field_enum.

Рассмотрим каким образом работать с этой таблицей в ORM.

  1. Переходим в список всех таблиц /bitrix/admin/perfmon_tables.php?lang=ru
  2. Добавляем к url параметр orm=y => /bitrix/admin/perfmon_tables.php?lang=ru&orm=y
  3. Теперь, если кликнуть на "бургер" рядом с названием у каждой таблицы появился пункт ORMORM
  4. Кликаем на него => система автоматически сгереирует класс с необходимыми полями
  5. Копируем получившийся код, переносим в проект (Например в файл /local/php_interface/classes/Bitrix/User/FieldEnumTable.php)
  6. В файле /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;
		}
	}
}
  1. Теперь мы можем подключать данную таблицу в запросы в виде \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),
		];
	}
}