start bootstrap advanced adminlte yii2

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