Миграции для модулей могут быть трёх видов:
- Добавление поля к существующему классу Entity
- Создание новой таблицы для Entity модуля
- Создание новой таблицы связи
Чтобы добавить новое поле к существующему классу Entity, нужно в методе install() класса Init вызвать метод migrateEntityField(), который принимает два параметра:
- Имя класса Entity, к которому нужно добавить поле
- Экземпляр класса Okay\Core\Modules\EntityField
Пример:
$this->migrateEntityField(VariantsEntity::class, (new EntityField('field_name'))->setTypeVarchar(255)->setIndex());
Также при добавлении поля к уже существующим сущностям, нужно его зарегистрировать в системе, чтобы оно учавствовало в SELECT и фильтрации (подробнее об Entities).
Пример:
$this->registerEntityField(VariantsEntity::class, 'field_name');
Это тоже самое, если бы это поле было прописано в одно из свойств класса VariantsEntity
use Okay\Core\Entity\Entity;
class VariantsEntity extends Entity
{
protected static $fields = [
'id',
'product_id',
'sku',
'price',
];
protected static $additionalFields = [
'(v.stock IS NULL) as infinity',
'c.rate_from',
'c.rate_to',
];
protected static $langFields = [
'name',
'units',
];
//...abstract
}
Чтобы создать таблицу для нового Entity (который добавляет модуль), нужно в методе install() класса Init вызвать метод migrateEntityTable(), который принимает два параметра:
- Имя класса Entity, к которому нужно добавить поле
- Массив экземпляров класса Okay\Core\Modules\EntityField
В массиве полей, нужно описать каждое поле, которое объявлено в Entity модуля.
Пример:
$this->migrateEntityTable(NPCostDeliveryDataEntity::class, [
(new EntityField('id'))->setIndexPrimaryKey()->setTypeInt(11, false)->setAutoIncrement(),
(new EntityField('order_id'))->setTypeInt(11)->setIndex(),
(new EntityField('city_id'))->setTypeVarchar(255, true),
(new EntityField('warehouse_id'))->setTypeVarchar(255, true),
(new EntityField('delivery_term'))->setTypeVarchar(8, true),
(new EntityField('redelivery'))->setTypeTinyInt(1, true),
(new EntityField('name'))->setTypeVarchar(255)->setIsLang(),
]);
Чтобы создать таблицу связи, нужно в методе install() класса Init вызвать метод migrateCustomTable(), который принимает два параметра:
- Название таблицы (без приставки ok_, можно с приставкой __)
- Массив экземпляров класса Okay\Core\Modules\EntityField
В массиве полей, нужно описать каждое поле, которое объявлено в Entity модуля.
Пример:
$this->migrateCustomTable('some_table_name', [
(new EntityField('redelivery'))->setTypeTinyInt(1),
(new EntityField('name'))->setTypeVarchar(255)->setIsLang(),
]);
$this->migrateCustomTable('__second_some_table_name', [
(new EntityField('redelivery'))->setTypeTinyInt(1),
(new EntityField('name'))->setTypeVarchar(255)->setIsLang(),
]);
Данный класс нужен для настройки поля (колонки) в базе данных, для их последующей миграции. Документацию по методам, см. в аннотации к методам. Метод в конструктор принимает название колонки, далее вся настройка происходит через fluent interface.
Пример:
$notLangField = (new EntityField('not_lang_field'))->setTypeVarchar(255)->setIndex();
$langField = (new EntityField('lang_field'))->setTypeVarchar(255)->setIndex()->setIsLang();