2017-06-03 100 views
2

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

回答

4

类似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(); 
+0

我同意这种做法,您应该建立预配置的分​​贝CONFIGS,但在技术上你可以动态改变任何组件的配置 - 如果你做得不对,你只是冒着弄脏事情的风险,否则就取决于那个组件。我主要提到这个情况,你可能提前不知道备用数据库规格。 – ldg