bootstrap - yii2 start
MĂșltiples conexiones de bases de datos y Yii 2.0 (4)
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 se instancia para cada uno de nuestros clientes, y la cantidad de bases de datos secundarias depende del cliente, también los nombres de las bases de datos son arbitrarios (aunque siguen un patrón).
Entonces
/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 la base de datos, primero configure
Yii::$app->params[''lodgedb'']
al nombre de la base de datos requerida:
Yii::$app->params[''lodgedb''] = $lodge->dbname; // used by LodgeActiveRecord
Sus clases de modelo no cambian, excepto que se extienden desde LodgeActiveRecord:
class BookingRooms extends /app/models/LodgeActiveRecord
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 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 establecido
db1
en el método
getDb()
, el resultado se obtendrá de
db1
y así sucesivamente.
ModelName::find()->select(''*'')->all();
Si está utilizando
schmunk42/yii2-giiant
para generar clases de modelo, hay una propiedad
''modelDb''
que puede configurar para usar un componente de base de datos que no sea
''db''
.
Solo para agregar: seguí la respuesta proporcionada pero aún 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 realiza una conexión a db. Por lo tanto, no puede eliminar o cambiar el nombre de ''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 encuentra db, se producirá un error.
Puedes nombrar
db2
como quieras.
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 para
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