yii2动态更改数据库

She*_*zod 2 database dsn yii2

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

Yer*_*rke 5

像这样db.php的配置无意在过程中更改(PHP正在处理)。当请求进入框架时,它们在初始化中被加载一次。或者,您可以预先在中配置第二个数据库db.php,并在它们之间进行动态更改,例如:

Yii::$app->db // your default Database
Run Code Online (Sandbox Code Playgroud)

Yii::$app->db2 // Second configured Database, to which you can switch dynamically later
Run Code Online (Sandbox Code Playgroud)

您可以在此处了解多个数据库连接

因此,如果希望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");
        }
    }

    //...
Run Code Online (Sandbox Code Playgroud)

然后在Controller中使用它,例如:

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

User::setDb(User::DB_DATABASE2);
$usersDB2 = User::find()->all();
Run Code Online (Sandbox Code Playgroud)

  • 我同意这种方法,您应该设置预先配置的数据库配置,但是从技术上讲,您可以动态更改任何组件的配置-您冒着搞砸事情的风险,否则如果不正确,就取决于该组件。对于您可能不事先知道备用数据库规范的情况,我主要提到这一点。 (2认同)