Yandex Metrika
sanches.free 1 просмотр

Таблица ORM в Bitrix D7: добавить и удалить столбец через SQL

Зачем отдельно трогать таблицу

Класс DataManager в D7 описывает колонку в getMap(), но платформа сама по себе не применяет DDL к продакшен-БД. После добавления записи поля на PHP нужно один раз привести схему MySQL к тому же набору имён и типов — например установочным модулем, обёрткой миграции или аккуратным SQL под свою политику релиза.

Снять снимок схемы

Имя пользователя и базы уже задаётся соединением; для проверки структуры достаточно стандартного запроса (подставьте реальный префикс и суффикс таблицы вашей ORM-сущности):

SHOW COLUMNS FROM b_loyalty_event_queue;

По столбцу Field видите имя поля в БД; по Type, Null и ключам можно свериться с тем, что ожидалось для выборки и индексов.

Убрать столбец

Не забудьте заранее отвязать от него свойства класса на PHP и любые связи зависимого кода, иначе запросы к ORM упадут сразу после выкладки DDL:

ALTER TABLE b_loyalty_event_queue DROP COLUMN legacy_batch_ref;

Добавить столбец под типы полей карты ORM

Ниже — практическая привязка к типичным классам из Bitrix\Main\ORM\Fields; длины varchar и ограничения NULL подстройте под бизнес-данные проекта:

  • StringField обычно мапится на VARCHAR подходящей длины.
  • TextFieldTEXT.
  • BooleanField в ядре чаще хранится как символический флаг, поэтому подходит ограниченный VARCHAR с запретом NULL, если в коде нет промежуточного состояния.
  • FloatFieldDOUBLE либо DECIMAL, когда необходимо фиксированное число знаков при выгрузках.
  • IntegerFieldINT; при нужде добавьте UNSIGNED на уровне домена счётчиков.
  • DatetimeFieldDATETIME.

Разовые примеры добавления столбца к нашей условной таблице можно свернуть так:

ALTER TABLE b_loyalty_event_queue ADD COLUMN campaign_slug VARCHAR(255) NOT NULL DEFAULT '';

ALTER TABLE b_loyalty_event_queue ADD COLUMN memo_body TEXT;

ALTER TABLE b_loyalty_event_queue ADD COLUMN hot_flag VARCHAR(1) NOT NULL DEFAULT 'N';

ALTER TABLE b_loyalty_event_queue ADD COLUMN price_delta DOUBLE NULL;

ALTER TABLE b_loyalty_event_queue ADD COLUMN redeem_count INT UNSIGNED NULL;

ALTER TABLE b_loyalty_event_queue ADD COLUMN synced_at DATETIME NULL;

Не стоит копировать длины и флаги NULL без проверки: для перечислимых полей возможно понадобится отдельный справочник или свойство элементов инфоблока вместо «сырой» строки.

Переименовать или сменить тип

Когда колонку нужно переосмыслить и одновременно поменять имя или тип данных, достаточно одной операции:

ALTER TABLE b_loyalty_event_queue CHANGE COLUMN old_bonus_rate rebate_rate DOUBLE NULL;

Третий и последний аргументы в синтаксисе CHANGE — новое системное имя и целевой тип столбца, во многих случаях совпадающий с тем, что вы уже использовали при добавлении аналогичного поля.

После применения SQL

  • Обновите getMap() и любые упоминания старого идентификатора в фильтрах и связях.
  • Очистите кеш приложения там, где ORM результат кешируется вручную.
  • На высоких нагрузках оцените влияние блокирующего ALTER под своим движком и размер таблицы — иногда DDL переносят в окно обслуживания.

Где искать связанные подсказки

Общие приёмы работы с базой данных в проекте на «1С‑Битрикс» см. в заметках о модуле database и выборках вокруг вашего контура задач.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии