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