Múltiples conexiones de base de datos y Yii 2.0

Tengo dos bases de datos, y cada base de datos tiene la misma tabla con los mismos campos, pero ¿cómo obtengo todos los registros de las dos bases de datos al mismo tiempo en Yii 2.0?

Primero necesita configurar sus bases de datos como se muestra a continuación:

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', ], ], ]; 

Entonces puedes simplemente:

 // 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() 

Si está utilizando un modelo de registro activo, en su modelo puede definir:

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

Entonces:

Si ha configurado db1 en el método getDb() , el resultado se obtendrá de db1 y así sucesivamente.

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

Solo para agregar: seguí la respuesta proporcionada, pero aún así recibí un error: “Id. De componente desconocido: db”

Después de algunas pruebas, esto es lo que descubrí: la función getDB solo se llama DESPUÉS de que se realice una conexión a db. Por lo tanto, no puede eliminar o renombrar ‘db’ en el archivo de configuración. En su lugar, debe dejar que la llamada a ‘db’ continúe normalmente y luego anularla.

La solución (para mí) fue la siguiente:

En config/web.php agregue su segunda configuración de base de datos debajo de db siguiente manera:

 '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(); }, ], 

NO cambie el nombre de db . Si no se encuentra db, se producirá un error. Puede nombrar db2 lo que quiera.

Ahora en el modelo, agregue el siguiente código:

 class ModelNameHere extends \yii\db\ActiveRecord { // add the function below: public static function getDb() { return Yii::$app->get('db2'); // second database } 

Esto ahora anulará la configuración predeterminada de db .

Espero que eso ayude a alguien más.

Nota: puede incluir la configuración de db2 en otro archivo, pero no puede incluirla en el archivo db.php (obviamente). En su lugar, cree un archivo llamado db2.php y db2.php como lo hace db :

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

Gracias

Nuestra situación es un poco más compleja, tenemos una base de datos “principal” que tiene una tabla que contiene el nombre de una o más bases de datos “secundarias”. La razón de esto es que el proyecto Yii está instanciado para cada uno de nuestros clientes, y la cantidad de bases de datos dependientes depende del cliente, también los nombres de las bases de datos son arbitrarios (aunque siguen un patrón).

Por lo tanto, reemplazamos \yii\db\ActiveRecord siguiente manera:

 class LodgeActiveRecord extends \yii\db\ActiveRecord { public static function getDb() { $lodgedb = Yii::$app->params['lodgedb']; if(array_key_exists( $lodgedb, Yii::$app->params['dbs'])) { return Yii::$app->params['dbs'][ $lodgedb ]; } $connection = new \yii\db\Connection([ 'dsn' => 'mysql:host=localhost;dbname=' . $lodgedb, 'username' => Yii::$app->params['dbuser'], 'password' => Yii::$app->params['dbpasswd'], 'charset' => 'utf8', ]); $connection->open(); // not sure if this is necessary at this point Yii::$app->params['dbs'][ $lodgedb ] = $connection; return $connection; } 

}

Antes de llamar a cualquier función de base de datos, primero configure Yii::$app->params['lodgedb'] con el nombre de la base de datos requerida:

 Yii::$app->params['lodgedb'] = $lodge->dbname; // used by LodgeActiveRecord 

Sus clases modelo no cambian, excepto que se extienden desde LodgeActiveRecord:

class BookingRooms extends \app\models\LodgeActiveRecord

Si está utilizando schmunk42/yii2-giiant para generar clases de modelo, hay una propiedad 'modelDb' que puede establecer para usar un componente de base de datos que no sea 'db' .

    Intereting Posts