2
我试图动态地移动到另一个数据库。我看到了几个问题,显示了从一个到另一个更改db文件,他们只是从下一个数据库获取一些信息。但我需要的是完全转向第二个数据库。我应该怎么做?我已经看到,为了实现这个dsn(在db.php文件中)应该被修改。但我改变了它,它仍然没有改变?我应该完全访问第一个关闭的第二个数据库。请给我建议yii2动态更改数据库
我试图动态地移动到另一个数据库。我看到了几个问题,显示了从一个到另一个更改db文件,他们只是从下一个数据库获取一些信息。但我需要的是完全转向第二个数据库。我应该怎么做?我已经看到,为了实现这个dsn(在db.php文件中)应该被修改。但我改变了它,它仍然没有改变?我应该完全访问第一个关闭的第二个数据库。请给我建议yii2动态更改数据库
类似db.php
的配置文件不打算在进程中进行更改(而PHP正在处理中)。当请求进入框架时,它们在初始化时加载一次。 作为替代方案,您可以配置第二DB事先在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)能够访问两个数据库,您可以定义一些静态变量,它指定从哪个数据库读/写。例如:
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");
}
}
//...
然后在控制器这样使用它:
User::setDb(User::DB_DATABASE1);
$usersDB1 = User::find()->all();
User::setDb(User::DB_DATABASE2);
$usersDB2 = User::find()->all();
我同意这种做法,您应该建立预配置的分贝CONFIGS,但在技术上你可以动态改变任何组件的配置 - 如果你做得不对,你只是冒着弄脏事情的风险,否则就取决于那个组件。我主要提到这个情况,你可能提前不知道备用数据库规格。 – ldg