Трейт для помощи создания миграций

Выкладываем свои наработки
Ответить
Аватара пользователя
carono
Сообщения: 52
Зарегистрирован: 2018.04.28, 11:05

Трейт для помощи создания миграций

Сообщение carono »

Всем привет, хочу поделиться своей работой. Я написал трейт для помощи в написании миграций (https://packagist.org/packages/carono/yii2-migrate), всю readme копировать сюда не буду, кому интересно, можно почитать здесь https://github.com/carono/yii2-migrate/ ... DME_RUS.md

Основные возможности:
Упрощено создание внешних ключей, имена ключей генерируются автоматически и можно создавать ключи через createTable и addColumn

Код: Выделить всё

$this->createTable('{{%user}}', [
    'id' => $this->primaryKey(),
    'company_id' => $this->foreignKey('{{%company}}')
]);
$this->addColumn('{{%user}}', 'company_id', $this->foreignKey('{{%company}}'));
$this->alterColumn('{{%user}}', 'company_id', $this->foreignKey('{{%company}}'));
Так же можно удалить внешний ключ, не указывая конкретное имя ключа, а только по названию колонки и таблицы

Код: Выделить всё

$this->dropForeignKeyByColumn('{{%user}}', 'company_id');
Можно делать более лаконичные миграции с самооткатываением, если описывать создание таблиц или добавление колонок в отдельных функциях.

Код: Выделить всё

 public function newTables()
    {
        return [
            '{{%logs}}' => [
                'data' => $this->string(),
            ],
             '{{%user}}' => [
                'id' => $this->primaryKey(),
                'login' => $this->string()
            ],
        ];
    }
    
    public function safeUp()
    {
        $this->upNewTables(); // созданим таблицы, которые указали в newTables
    }
    
    public function safeUp()
    {
        $this->downNewTables(); // удалим эти таблицы в обратном порядке
    }
Это не все возможности, больше описано в редми на гитхабе. Код протестирован на mysql и postgresql, и покрыт по большей части тестами.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Трейт для помощи создания миграций

Сообщение SiZE »

Код: Выделить всё

 public function newTables()
    {
        return [
            '{{%logs}}' => [
                'data' => $this->string(),
            ],
             '{{%user}}' => [
                'id' => $this->primaryKey(),
                'login' => $this->string()
            ],
        ];
    }
vs

Код: Выделить всё

$this->createTable('{{%logs}}', [
     'data' => $this->string(),
]);

$this->createTable('{{%logs}}', [
     'id' => $this->primaryKey(),
     'login' => $this->string()
]);
Очень сомнительное преимущество, вместо передачи явных параметров методу создания таблицы, описывать метод, который возвращает массив
Аватара пользователя
carono
Сообщения: 52
Зарегистрирован: 2018.04.28, 11:05

Re: Трейт для помощи создания миграций

Сообщение carono »

Это если смотреть на небольшом примере, разумеется выглядит сомнительно, но на этапе создания архитектуры, когда можно за раз создать много таблиц, или же добавить множество колонок (в этой теме примера нет), то не будет необходимости писать в safeDown удаление таблиц и колонок, иначе на каждый create, писать опять drop.

А если создать шаблон миграции, где уже будут подготовленные функции newTables и newColumns, а в safeUp написано только upNewTables, upNewColumns, то это действительно экономит время.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Трейт для помощи создания миграций

Сообщение SiZE »

carono писал(а): 2018.08.29, 19:45 А если создать шаблон миграции, где уже будут подготовленные функции newTables и newColumns, а в safeUp написано только upNewTables, upNewColumns, то это действительно экономит время.
Если честно, я с такими велосипедами в миграции уже имел неоднократно дело. Всякий раз кто нибудь из коллег решает оптимизировать "рутину". По факту получается наоборот.
Аватара пользователя
carono
Сообщения: 52
Зарегистрирован: 2018.04.28, 11:05

Re: Трейт для помощи создания миграций

Сообщение carono »

Это конечно не идеал самооткатывающихся миграций, которые нам обещают в Yii3 (и будут ли), лучше конечно было бы все зашить внутрь, чтобы не пользоваться доп фукнциями со своим синтаксисом, но тогда всё станет менее очевидным.
Ответить