yii2动态更改数据库

时间:2017-06-03 09:41:16

标签: database yii2 dsn

我正在尝试动态移动到另一个数据库。我已经看到几个问题,显示从一个到另一个更改db文件,他们只是从下一个数据库获取一些信息。但我需要的是完全转移到第二个数据库。我该怎么做?我已经看到,为了实现这个dsn(在db.php文件中)应该改变。但我改变它,它仍然没有改变?我应该完全访问第二个数据库关闭第一个。请给我建议

2 个答案:

答案 0 :(得分:4)

db.php之类的配置不打算在进程中更改(当PHP处理时)。当请求进入框架时,它们在初始化时被加载一次。 作为替代方案,您可以预先在db.php中配置第二个数据库,并在它们之间动态更改,如:

Yii::$app->db // your default Database

Yii::$app->db2 // Second configured Database, to which you can switch dynamically later

您可以了解multiple database connections here

因此,如果您希望ActiveRecord(例如User)能够访问两个数据库,您可以定义一些静态变量,该变量指定从哪个DB读/写。例如:

class User extends \yii\db\ActiveRecord
{
    const DB_DATABASE1 = 'db1';
    const DB_DATABASE2 = 'db2';

    private static $db = self::DB_DATABASE1;

    public static function setDb($db)
    {
        self::$db = $db;
    }

    public static function getDb()
    {
        switch (self::$db) {
            case self::DB_DATABASE1:
                return Yii::$app->db;
            case self::DB_DATABASE2:
                return Yii::$app->db2;
            default:
                throw new \Exception("Database is not selected");
        }
    }

    //...

然后在Controller中使用它:

User::setDb(User::DB_DATABASE1);
$usersDB1 = User::find()->all();

User::setDb(User::DB_DATABASE2);
$usersDB2 = User::find()->all();

答案 1 :(得分:1)

在您的 main.php main-local.php 配置中设置多个数据库连接

Yii::$app->db1;
Yii::$app->db2;
Yii::$app->db3;

查询时

$usersDB1=User::find()->all(Yii::$app->db1);
$usersDB2=User::find()->all(Yii::$app->db2);
$usersDB3=User::find()->all(Yii::$app->db3);