J’ai deux bases de données et chaque firebase database a la même table avec les mêmes champs, mais comment puis-je obtenir tous les enregistrements de toutes les deux bases de données en même temps dans Yii 2.0?
Vous devez d’abord configurer vos bases de données comme ci-dessous:
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', ], ], ];
Ensuite, vous pouvez simplement:
// 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 vous utilisez un modèle d’enregistrement actif, vous pouvez définir dans votre modèle:
public static function getDb() { return Yii::$app->db1; } //Or db2 public static function getDb() { return Yii::$app->db2; }
Alors:
Si vous avez défini db1
dans la méthode getDb()
, le résultat sera extrait de db1
et ainsi de suite.
ModelName::find()->select('*')->all();
Juste pour append: j’ai suivi la réponse fournie mais j’ai toujours une erreur: “ID du composant inconnu: db”
Après quelques tests, voici ce que j’ai découvert: La fonction getDB est appelée uniquement APRÈS qu’une connexion est établie avec db. Par conséquent, vous ne pouvez pas supprimer ou renommer “db” dans le fichier de configuration. Au lieu de cela, vous devez laisser l’appel à “db” procéder comme d’habitude et ensuite le remplacer.
La solution (pour moi) était la suivante:
Dans config/web.php
ajoutez votre deuxième configuration de firebase database ci-dessous comme suit:
'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(); }, ],
NE PAS renommer db
. Si vous ne trouvez pas la firebase database, cela provoquera une erreur. Vous pouvez nommer db2
ce que vous voulez.
Maintenant, dans le modèle, ajoutez le code suivant:
class ModelNameHere extends \yii\db\ActiveRecord { // add the function below: public static function getDb() { return Yii::$app->get('db2'); // second database }
Cela va maintenant remplacer la configuration par défaut de la db
.
J’espère que ça aide quelqu’un d’autre.
Note: vous pouvez inclure la configuration de db2
dans un autre fichier mais vous ne pouvez pas l’inclure dans le fichier db.php
(évidemment). Au lieu de cela, créez un fichier appelé db2.php
et appelez-le comme vous le faites:
'db' => require(__DIR__ . '/db.php'), 'db2' => require(__DIR__ . '/db2.php'),
Merci
Notre situation est un peu plus complexe, nous avons une firebase database “parent” qui contient une table contenant le nom d’une ou plusieurs bases de données “enfants”. La raison en est que le projet Yii est instancié pour chacun de nos clients et que le nombre de bases de données enfants dépend du client. De plus, les noms de firebase database sont arbitraires (bien que suivant un modèle).
Donc, nous remplaçons \yii\db\ActiveRecord
comme suit:
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; }
}
Avant d’appeler une fonction de firebase database, définissez d’abord Yii::$app->params['lodgedb']
sur le nom de la firebase database requirejse:
Yii::$app->params['lodgedb'] = $lodge->dbname; // used by LodgeActiveRecord
Vos classes de modèle ne changent pas sauf qu’elles s’étendent depuis LodgeActiveRecord:
class BookingRooms extends \app\models\LodgeActiveRecord
Si vous utilisez schmunk42/yii2-giiant
pour générer des classes de modèle, il existe une propriété 'modelDb'
que vous pouvez définir pour utiliser un composant de firebase database autre que 'db'
.