2017-06-03 29 views
2

私は動的に別のデータベースに移動しようとしています。 dbファイルを変更するいくつかの質問がありましたが、次のデータベースからいくつかの情報が得られました。しかし、私が必要とするのは完全に2番目のデータベースに移動することです。私はこれをどのようにするべきですか?私はこれを達成するためにdsn(db.phpファイル内)を変更する必要があることを見てきました。しかし、私はそれを変更し、それはまだ変更されていない??最初のデータベースを閉じる2番目のデータベースに完全にアクセスする必要があります。yii2データベースを動的に変更する

答えて

4

db.phpのような設定は、処理中(PHPの処理中)に変更することを意図していません。要求がフレームワークに入力されると、それらは初期化で一度ロードされます。 別の方法として、あなたはdb.phpに予め二DBを構成することができ、かつ動的などのそれらの間の変更:あなたがしたい場合

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)は2つのデータベースにアクセスできるようにするために、どの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"); 
     } 
    } 

    //... 

そしてコントローラーでそれを使用したいと:

User::setDb(User::DB_DATABASE1); 
$usersDB1 = User::find()->all(); 

User::setDb(User::DB_DATABASE2); 
$usersDB2 = User::find()->all(); 
+0

が、私はこのアプローチに同意し、あなたが事前に設定デシベルのコンフィグを設定する必要がありますが、技術的にはあなたが動的に任意のコンポーネントの設定を変更することができること - あなたがそれを正しく行なわなければ、そのコンポーネントに依存しているものを混乱させるリスクを冒すだけです。私は、あなたが事前に代替のdb仕様を知らないかもしれない場合のためにこれを主に言及します。 – ldg

関連する問題