Skip to content

Конструктор моделей

Создать таблицу и получить миграцию и модель — прямо из менеджера, не открывая редактор. PageBlocks → Конструктор → Миграции.

Только для sudo

Все его маршруты закрыты middleware SudoOnly. Он пишет файлы в core/App/ и запускает миграции по живой базе, так что контент-менеджеру здесь делать нечего.

Что получается

Одна строка конструктора превращается в три вещи:

  1. миграцию Phinx в core/App/Database/migrations/;
  2. после её выполнения — core/App/Models/Base<Модель>.php, собранную по настоящим колонкам таблицы;
  3. core/App/Models/<Модель>.phpтолько если его ещё нет.

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

Базовую модель править нельзя

Она молча перезапишется при следующей миграции по этой таблице.

Поля строки

ПолеЧто это
nameЧеловеческое название, видно в списке
table_nameТаблица, без префикса
model_nameКласс модели для генерации. Пусто — «только миграция»
table_commentКомментарий к таблице
typeЧто делает миграция — см. ниже
statuspending, executed, rolled_back, failed
with_constructor_fieldsДобавить хвост конструктора — data, menuindex, published_at
with_timestampsДобавить created_at / updated_at
with_soft_deletesДобавить deleted_at

Все три галочки по умолчанию включены: созданная здесь таблица сразу готова к публикации, сортировке, корзине и полям конструктора, и думать об этом не нужно.

Типы

create_table, drop_table, add_column, change_column, drop_column, rename_column, add_index, drop_index, add_foreign_key, drop_foreign_key.

Колонки описываются в дочернем гриде — тип, длина, точность, nullable, unsigned, значение по умолчанию, комментарий, after и индекс с его видом (index, unique, fulltext). Внешние ключи — отдельный грид, с on_delete и on_update.

Запуск

Выполнить пишет файл миграции, прогоняет Phinx по слою сайта (core/App/phinx.php, журнал pb_app_migrations) и затем генерирует модель. Статус становится executed, заполняется executed_at.

Откат разрешён только для миграции в статусе executed — на всё остальное ответ 405.

Текущая форма таблицы берётся не из схемы базы, а пересчитывается по всем выполненным миграциям этой таблицы. Именно это позволяет add_column знать, что у модели уже есть.

У удалённой таблицы файлы остаются

drop_table намеренно не трогает core/App/Models/. Убрать таблицу — решение о схеме, а удалить вашу модель вместе со всем, что вы в ней написали, конструктор решать не должен.

Когда две миграции сталкиваются

Две отдельные строки «добавить колонку в pb_cargo» захотели бы одно имя класса. Сервис проверяет существующие файлы и разводит имена, поэтому вторая миграция по той же таблице не затирает файл первой.

Куда это пишет

Конструктор моделей пишет в слой сайта и никогда — в компонент. Поэтому он безопасен: обновление компонента не может перезаписать сгенерированное, а сгенерированное не может уехать в чужую установку.

Про устройство миграций и два конфига Phinx — Миграции; про то, что умеет сгенерированная модель — Модели.

© PageBlocks 2019-present