Используем миграции Yii2 для работы с несколькими базами данных

в 17:17, , рубрики: php, yii, yii2, миграции бд

Миграции являются удобным инструментом для изменения структуры базы данных и поддержания ее в актуальном состоянии.

Yii2 поддерживает миграции из коробки. Использование миграций подробно описано в документации. Управление миграциями осуществляется из командной строки.

В статье описывается использование миграций для управления несколькими схемами БД. Как оказалось, это совсем несложно реализовать, но почему-то не нашел ни одного описания.
Нередко мне встречаются проекты, где используется более одной базы данных. В этом случае хочется управлять каждой базой в отдельности. Как вариант, можно в каждой миграции указывать, к какой базе данных ее применять, или явно указывать бд в каждом запросе. Но это не очень удобно и есть большая вероятность случайно накатить миграцию не на ту базу. Кроме того, таблица миграций все равно будет только в основной базе.

К сожалению, готового решения не нашел, поэтому заглянем в код фреймворка и посмотрим, как работают миграции.

Команда yii migrate использует yiiconsolecontrollersMigrateController

Для создания новой миграции используется шаблон migration.php

Все миграции наследуются от yiidbMigration.

1. Для начала переопределяем базовый класс миграции для каждой БД. В папке components создаем классы CustomMigrationDb и CustomMigrationDb2

CustomMigrationDb2.php

<?php

namespace appcomponents;

use yiidbMigration;

class CustomMigrationDb2 extends Migration{
    public function init()
    {
        $this->db = 'db2';
        parent::init();
    }
}

2. В папке viewsmigrations создаем файлы migration_db.php и migration_db2.php — шаблоны для новых миграций. Достаточно скопировать базовый шаблон и поменять базовый класс на те, что мы только что создали.

migration_db2.php

<?php
/**
 * This view is used by console/controllers/MigrateController.php
 * The following variables are available in this view:
 */
/* @var $className string the new migration class name */

echo "<?phpn";
?>

use yiidbSchema;
use appcomponentsCustomMigrationDb2;

class <?= $className ?> extends CustomMigrationDb2
{
    public function up()
    {

    }

    public function down()
    {
        echo "<?= $className ?> cannot be reverted.n";

        return false;
    }

    /*
    // Use safeUp/safeDown to run migration code within a transaction
    public function safeUp()
    {
    }

    public function safeDown()
    {
    }
    */
}

3. Теперь создаем контроллеры. В папке commands создаем классы MigrateDbController и MigrateDb2Controller. Наследуем их от yiiconsolecontrollerMigrateController.

MigrateDb2Controller.php

<?php

namespace appcommands;

use yiiconsolecontrollersMigrateController;

class MigrateDb2Controller extends MigrateController
{
    public $db = 'db2';
    public $templateFile = '@app/views/migrations/migration_db2.php';
    public $migrationPath = '@app/migrations/db2';
}

Здесь указываем базу данных, в которой будет создана таблица с миграциями, шаблон для создания новых миграций и путь до папки с миграциями.

4. Отключаем стандартный yii migrate, вместо него будем использовать один из созданных контроллеров. Для этого добавим в файл configconsole.php следующий код:

'controllerMap' => [
    ...
    'migrate' => [
        'class' => 'appcommandsMigrateDbController',
    ],
],

В результате получаем независимые миграции для каждой БД. Миграции запускаются командами

yii migrate-db
yii migrate-db2

Работают как обычные миграции. Новые миграции создаются в отдельных папках для каждой бд командами

yii migrate-db/create и
yii migrate-db2/create

Написал небольшое приложение для демонстрации. Выложил на github.
Спасибо за внимание

Автор: antonshell

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js