2014-12-02 18 views

Odpowiedz

77

Najpierw trzeba skonfigurować baz danych jak poniżej:

return [ 
'components' => [ 
    'db1' => [ 
     'class' => 'yii\db\Connection', 
     'dsn' => 'mysql:host=localhost;dbname=db1name', //maybe other dbms such as psql,... 
     'username' => 'db1username', 
     'password' => 'db1password', 
    ], 
    'db2' => [ 
     'class' => 'yii\db\Connection', 
     'dsn' => 'mysql:host=localhost;dbname=db2name', // Maybe other DBMS such as psql (PostgreSQL),... 
     'username' => 'db2username', 
     'password' => 'db2password', 
    ], 
], 
]; 

Następnie można po prostu:

// To get from db1 
Yii::$app->db1->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll() 

// To get from db2 
Yii::$app->db2->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll() 

Jeśli używasz aktywnego modelu rekord w modelu można zdefiniować:

public function getDb() { 
    return Yii::$app->db1; 
} 

//Or db2 
public function getDb() { 
    return Yii::$app->db2; 
} 

Następnie:

Jeśli ustawiono db1 w metodzie getDb(), wynik zostanie pobrany z db1 i tak dalej.

ModelName::find()->select('*')->all(); 
+2

Z góry dzięki za Twój wielki answer.It jest naprawdę pomocne. –

+0

@ChhornSoro Witaj drogi –

+1

Wystąpił błąd przy użyciu Twojego kodu. To nie jest całkowicie błędne, ale myślę, że coś przeoczyłeś. Pominąłeś "" class "=> 'yii \ db \ Connection'" po powrocie [ – nodeffect

14

Wystarczy dodać: Śledziłem odpowiedź zapewnione, ale wciąż mam błąd: „Nieznany składnik ID: DB”

Po kilku testach, tutaj jest to, co odkryłem: Funkcja getDB jest tylko o nazwie PO nawiązano połączenie z db. Dlatego nie można usunąć ani zmienić nazwy "db" w pliku konfiguracyjnym. Zamiast tego powinieneś pozwolić, aby wywołanie "db" przebiegło normalnie, a potem je przesłonić.

Rozwiązanie (dla mnie) był następujący:

W config/web.php dodać swoją drugą konfigurację bazy poniżej db następująco:

'db' => require(__DIR__ . '/db.php'), 
'db2' => [ 
    'class' => 'yii\db\Connection', 
    'dsn' => 'mysql:host=localhost;dbname=name', 
    'username' => 'user', 
    'password' => 'password', 
    'charset' => 'utf8', 
    'on afterOpen' => function ($event) { 
     $event->sender->createCommand("SET time_zone = '+00:00'")->execute(); 
    }, 
], 

NIE przemianować db. Nieodnalezienie bazy danych spowoduje błąd. Możesz dowolnie nazywać db2.

Teraz w modelu, dodaj następujący kod:

class ModelNameHere extends \yii\db\ActiveRecord { 

    // add the function below: 
    public static function getDb() { 
     return Yii::$app->get('db2'); // second database 
    } 

To będzie teraz zastąpić domyślną konfigurację db.

Mam nadzieję, że pomaga komuś innemu.

Uwaga: konfigurację dla db2 można dołączyć do innego pliku, ale nie można jej dołączyć do pliku db.php (oczywiście). Zamiast tego, należy utworzyć plik o nazwie db2.php i nazwać jak ty db:

'db' => require(__DIR__ . '/db.php'),  
'db2' => require(__DIR__ . '/db2.php'), 

Dzięki

+0

Zmieniłem nazwę na "db" i zadziałało. Poza tym twoje rozwiązanie działa. – ColinWa

+0

Próbowałem twoje, ale mam 'SQLSTATE [42000]: [Microsoft] [Sterownik ODBC 11 dla SQL Server] [Serwer SQL] Niepoprawna składnia w pobliżu '='. Wykonywany SQL: SET time_zone = '+00: 00'', jakiś pomysł? dzięki – Blackjack