2017-06-03 90 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