【问题标题】:Yiic migration for multiple databaseYiic 多数据库迁移
【发布时间】:2015-11-05 20:45:39
【问题描述】:

是否可以为多个数据库运行 Yiic migrate create 命令?

我有一个多租户数据架构、一个源代码和多个客户端数据库。每个客户端将使用相同的源代码,但使用单独的数据库。

例如。 Andrew.Digital.com、Samson.Digital.com 将有两个数据库但指向相同的源代码。

所以我只想知道是否有可能将 Yiic 迁移用于多个数据库?

什么是 SAAS(多租户)https://msdn.microsoft.com/en-us/library/aa479086.aspx

【问题讨论】:

标签: php mysql yii saas yiic


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    1:在console/controllers/MigrateController下新建一个控制器类(MigrateController

    2:将以下内容添加到上面创建的类(MigrateController)(console/controllers/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:在你的控制台/config/main.php 中添加迁移控制器映射

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

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

    5:你已经完成了一切!!!

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

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 2014-01-13
      • 2013-09-26
      • 2013-03-06
      • 2016-11-28
      • 1970-01-01
      • 2023-03-28
      • 2017-06-11
      • 2016-06-07
      相关资源
      最近更新 更多