Yiic миграция для нескольких баз данных

Можно ли запустить команду Yiic migrate create для нескольких баз данных?

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

Ex. Andrew.Digital.com, Samson.Digital.com будет иметь две базы данных, но указывает на один и тот же исходный код.

Так что я просто хочу знать, есть ли возможность использовать миграцию Yiic для нескольких баз данных?

Что такое SAAS (мультитенант) https://msdn.microsoft.com/en-us/library/aa479086.aspx

1

Решение

Вы можете настроить более одного подключения в вашем защищенном / config / console.php

Затем при запуске миграции укажите идентификатор соединения

/yiic migrate --connectionID=db         # The default
/yiic migrate --connectionID=andrew     # connection andrew
/yiic migrate --connectionID=client3    # connection client3
3

Другие решения

Вы можете настроить несколько соединений с базой данных и упомянуть в команде migrate, как указано выше, @crafter, ИЛИ вы можете переопределить соединение с БД во время выполнения и сделать его динамическим.

Вот некоторые шаги, чтобы переопределить класс контроллера Yii migrate по умолчанию и использовать несколько миграций базы данных.

1: Создать новый класс контроллера (MigrateController) под консолью / контроллерами / MigrateController

2: добавить содержимое ниже в созданный выше класс (MigrateController) (консоль / контроллеры / MigrateController).

« `

<?php
/**
* Yii MigrateController class that will override default up functionality & used dynamic connection based on your settings, or DB lists
* @author Nadeem Akhtar <[email protected]>
* Date: 1/19/16
* Time: 4:34 PM
*/


namespace console\controllers;

use Yii;
use yii\console\controllers\MigrateController as BaseMigrateController;
use yii\helpers\Console;

/**
* Test controller
*/
class MigrateController extends BaseMigrateController {

/*
* init function
*
*
* */
public function init() {
parent::init();
}

/**
* Upgrades the application by applying new migrations.
* For example,
*
* ```
* yii migrate     # apply all new migrations
* yii migrate 3   # apply the first 3 new migrations
* ```
*
* @param integer $limit the number of new migrations to be applied. If 0, it means
* applying all available new migrations.
*
* @return integer the status of the action execution. 0 means normal, other values mean abnormal.
* Example call: **./yii migrate/migrate-up**
*/
public function actionMigrateUp($limit = 0)
{
// Get all databases from companies settings
$companies = Companies::find()->where('settings')->all();

foreach($companies as $company) {

$this->setRunTimeConnection($company['settings']); // This will set dynamic connection based on your record in DB

$this->stdout("New migration founds for ".$company['name'].".\n", Console::FG_GREEN); // print message to show which migration is runing for which company
$this->actionUp($limit);
}
}

/*
* Dynamic connection
* Override default **Yii::$app->db** settings
*
* */

public function setRunTimeConnection($setting) {

$host = $setting['DB_host'];
$dbName = $setting['DB_name'];

$dsn = "mysql:host=$host;dbname=$dbName"; //Host & Database
Yii::$app->db->dsn = $dsn;
Yii::$app->db->username = $setting['DB_username'];
Yii::$app->db->password = $setting['DB_password'];
}
}

3: Добавить карту контроллера переноса в вашей консоли / config / main.php

.
.
.
'controllerMap' => [
'migrate'   => 'console\controllers\MigrateController',
],

4: Теперь создайте несколько фиктивных миграций и добавьте три или четыре базы данных в свои списки $ array

5: Вы сделали все !!!

Вы можете играть больше на этом в соответствии с вашими требованиями.

1

По вопросам рекламы [email protected]