Страница 1 из 1

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

Добавлено: 2018.08.28, 12:27
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, и покрыт по большей части тестами.

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

Добавлено: 2018.08.29, 18:05
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()
]);
Очень сомнительное преимущество, вместо передачи явных параметров методу создания таблицы, описывать метод, который возвращает массив

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

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

А если создать шаблон миграции, где уже будут подготовленные функции newTables и newColumns, а в safeUp написано только upNewTables, upNewColumns, то это действительно экономит время.

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

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

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

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