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