- PVSM.RU - https://www.pvsm.ru -
Миграции являются удобным инструментом для изменения структуры базы данных и поддержания ее в актуальном состоянии.
Yii2 поддерживает миграции из коробки. Использование миграций подробно описано в документации [1]. Управление миграциями осуществляется из командной строки.
В статье описывается использование миграций для управления несколькими схемами БД. Как оказалось, это совсем несложно реализовать, но почему-то не нашел ни одного описания.
Нередко мне встречаются проекты, где используется более одной базы данных. В этом случае хочется управлять каждой базой в отдельности. Как вариант, можно в каждой миграции указывать, к какой базе данных ее применять, или явно указывать бд в каждом запросе. Но это не очень удобно и есть большая вероятность случайно накатить миграцию не на ту базу. Кроме того, таблица миграций все равно будет только в основной базе.
К сожалению, готового решения не нашел, поэтому заглянем в код фреймворка и посмотрим, как работают миграции.
Команда yii migrate использует [2] yiiconsolecontrollersMigrateController [3]
Для создания новой миграции используется шаблон migration.php [4]
Все миграции наследуются от yiidbMigration [5].
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
Написал небольшое приложение [6] для демонстрации. Выложил на github.
Спасибо за внимание
Автор: antonshell
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/115569
Ссылки в тексте:
[1] документации: https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/db-migrations.md
[2] использует: https://github.com/yiisoft/yii2/blob/master/framework/console/Application.php#L193
[3] yiiconsolecontrollersMigrateController: https://github.com/yiisoft/yii2/blob/master/framework/console/controllers/MigrateController.php
[4] migration.php: https://github.com/yiisoft/yii2/blob/master/framework/views/migration.php
[5] yiidbMigration: https://github.com/yiisoft/yii2/blob/master/framework/db/Migration.php
[6] небольшое приложение: https://github.com/antonshell/yii2-multiple-db-migration
[7] Источник: https://habrahabr.ru/post/279701/
Нажмите здесь для печати.