web-dev-qa-db-fra.com

Laravel: connexion dynamique aux bases de données

Je crée une application dans Laravel 5(.1) où il est nécessaire de se connecter à différentes bases de données. Le seul problème est qu'on ne sait pas lequel bases de données auxquelles il doit se connecter, il n'est donc pas possible d'utiliser le fichier database.php dans config. Un contrôleur est chargé d'établir une connexion avec des détails de connexion donnés dynamiquement.

Comment puis-je établir une nouvelle connexion à une base de données, y compris en utilisant la classe DB? (Ou est-ce possible)

Merci d'avance!

19
Roboroads

La solution la plus simple consiste à définir votre configuration de base de données lors de l'exécution. Laravel peut s'attendre à ce que ces paramètres soient chargés à partir du config/database.php fichier, mais cela ne signifie pas que vous ne pouvez pas les définir ou les modifier ultérieurement.

La configuration chargée depuis config/database.php est stocké sous la forme database dans Laravel config. Signification, le tableau connections à l'intérieur de config/database.php est stocké dans database.connections.

Vous pouvez donc facilement remplacer/modifier ces connexions comme ceci:

Config::set("database.connections.mysql", [
    "Host" => "...",
    "database" => "...",
    "username" => "...",
    "password" => "..."
]);

À partir de là, tous les modèles Eloquent qui utilisent cette connexion mysql utiliseront cette nouvelle configuration de connexion à la base de données.

Je recommanderais de faire cela dans un fournisseur de services si possible.

21
jszobody

Je suis tombé sur le même problème.

Vous pouvez réellement modifier les paramètres de la base de données lors de l'exécution et les utiliser.

Utilisez la fonction config () pour définir des paramètres de connexion supplémentaires ou écraser.

config(['database.connections.mynewconnection' => {settings here}]);

N'oubliez pas que ces paramètres sont mis en cache. Ainsi, lorsque vous devez utiliser les nouveaux paramètres, purgez le cache DB pour la connexion que vous allez utiliser.

DB::purge('mynewconnection');

Vous pouvez également manipuler la connexion par défaut utilisée. Cela peut être utile si vous souhaitez utiliser des migrations sur différentes connexions et en faire le suivi avec une table de migration dans la connexion utilisée. Ou d'autres trucs sympas bien sûr ...

DB::setDefaultConnection('mynewconnection');
10
feskr

J'ai également rencontré ce problème avec un script qui importe plusieurs fichiers MS Access DB dans MySQL et je n'ai été satisfait d'aucune des solutions suggérant de modifier la configuration au moment de l'exécution. Il était moche et désordonné de créer dynamiquement une nouvelle configuration pour chaque fichier Access DB que je voulais importer. Après avoir joué, j'ai réussi à persuader Laravel de basculer les bases de données sur la connexion existante comme ceci:

$mysqlConn = DB::connection();
$mysqlConn->getPdo()->exec("USE $schemaName;");
$mysqlConn->setDatabaseName($schemaName);
0
Derek