在项目中经常会碰到多个数据库的情况,在 yii 中也是可以快速设置的

演示的版本是 basic 版,但是原理很好理解

编辑配置文件 @app/config/web.php

1
2
3
4
......
'db' => require(__DIR__ . '/db.php'), //框架提供的一个默认连接
'localDb' => require(__DIR__ . '/db2.php'), //这个是我们新加的一个连接配置
......

在同目录下的 db2.php 内容格式和 db.php 格式一样,只是连接不同

修改 model 中需要使用的 connection id

这时再在想改的 model 中复写 getDb() 方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
class Members extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'members';
    }

    /**
     * @return \yii\db\Connection the database connection used by this AR class.
     */
    public static function getDb()
    {
        return Yii::$app->get('localDb');
    }

    ......some functions.................
}

这个 model 中我们使用了 localDb 的链接配置,可以追踪代码 \yii\db\ActiveRecord中的 getDb() 方法,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//in \yii\db\ActiveRecord

/**
    * Returns the database connection used by this AR class.
    * By default, the "db" application component is used as the database connection.
    * You may override this method if you want to use a different database connection.
    * @return Connection the database connection used by this AR class.
    */
   public static function getDb()
   {
       return Yii::$app->getDb();
   }

有这么一段,既然已经显示出来 Yii::$app 这种核心的东西了,说明已经离那个connection容器已经不远了 再追踪到getDb() 显示的是 $this->get('db') 转换一下不就是默认使用的 Yii::$app->get('db') 吗? 于是回到最开始的 model 中,将其重写为 Yii::$app->get('localDb'),之后我们再使用这个 model 的时候就是使用的id 为localDb的 connection 单例了