2017-06-03 8 views
2

Ich versuche, dynamisch in eine andere Datenbank zu verschieben. Ich habe mehrere Fragen gesehen, die zeigten, dass sich db-Dateien von einem zum anderen ändern und sie nur einige Informationen von der nächsten Datenbank bekommen. Aber was ich brauche, ist komplett in die zweite Datenbank zu bewegen. Wie soll ich das machen? Ich habe gesehen, dass, um dies zu erreichen, dsn (in db.php-Datei) geändert werden sollte. Aber ich habe es geändert und es ist immer noch nicht verändert ?? Ich sollte vollständigen Zugang zu der zweiten Datenbank haben, die zuerst schließt. Gib mir einen Rat bitteyii2 Datenbank dynamisch ändern

Antwort

4

Configs wie db.php sind nicht dazu bestimmt, im Prozess (während PHP verarbeitet wird) geändert werden. Sie werden einmal bei der Initialisierung geladen, wenn die Anfrage in das Framework eingegeben wird. Als Alternative können Sie zweite DB vorher in db.php, konfigurieren und wie zwischen ihnen dynamisch ändern:

Yii::$app->db // your default Database 
kann

und

Yii::$app->db2 // Second configured Database, to which you can switch dynamically later 

Sie lernen multiple database connections here

, Also, wenn Sie wollen ActiveRecord (z. B. Benutzer) Um auf zwei Datenbanken zugreifen zu können, können Sie eine statische Variable definieren, die angibt, von welcher DB gelesen/geschrieben werden soll. Zum Beispiel:

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"); 
     } 
    } 

    //... 

Und es dann in den Controller wie:

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

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

ich mit diesem Ansatz einverstanden sind und dass Sie sollten vorkonfigurierte db configs eingerichtet, aber technisch könnte Sie eine Komponente config dynamisch ändern - Sie laufen einfach Gefahr, Dinge zu vermasseln, die ansonsten von dieser Komponente abhängen, wenn Sie es nicht richtig machen. Ich erwähne das meistens für den Fall, dass Sie die alternativen db specs im Voraus nicht kennen. – ldg