1

Is it possible to run Yiic migrate create command for multiple databases ?

I have a Multi-Tenant Data Architecture, one source code and multiple database for client. each client will use same source code and but a separate database.

Ex. Andrew.Digital.com, Samson.Digital.com will have two database but points to same source code.

So i just want to know is there any possibility to use Yiic migration for multiple databases ?

What is SAAS (Multi-Tenant) https://msdn.microsoft.com/en-us/library/aa479086.aspx

4

2 回答 2

3

您可以在 protected/config/console.php 上配置多个连接

然后,在运行迁移时,指定连接 ID

/yiic migrate --connectionID=db         # The default
/yiic migrate --connectionID=andrew     # connection andrew
/yiic migrate --connectionID=client3    # connection client3
于 2015-08-13T16:18:10.517 回答
2

您可以配置多个数据库连接并在上面提到的@crafter迁移命令中提及,或者您可以在运行时覆盖数据库连接并使其动态化。

以下是覆盖默认 Yii 迁移控制器类并使用多个数据库迁移的一些步骤。

1:在console/controllers/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 <nadeem@myswich.com>
 * 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:在你的 console/config/main.php 中添加迁移控制器映射

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

4:现在创建一些虚拟迁移并在 $array 列表中添加三个或四个数据库

5:你都做了!!!

您可以根据自己的要求玩更多。

于 2016-05-16T17:58:26.290 回答