web-dev-qa-db-ja.com

Laravel:データベースに動的に接続する

Laravel 5(.1)異なるアプリケーションに接続する必要がある場所でアプリケーションを作成しています。唯一の問題は、接続する必要があるデータベースなので、configでdatabase.phpを使用することはできません。動的に指定された接続の詳細で接続を行うのはコントローラーの役割です。

DBクラスの使用を含め、データベースへの新しい接続を作成するにはどうすればよいですか? (またはこれは可能ですか)

前もって感謝します!

19
Roboroads

最も簡単な解決策は、実行時にデータベース構成を設定することです。 Laravelは、これらの設定がconfig/database.phpファイルから読み込まれることを期待する場合がありますが、後で設定または変更できないことを意味するわけではありません。

config/database.phpからロードされた設定は、databaseとしてLaravel config。に格納されます。つまり、config/database.php内のconnections配列は、 database.connections

したがって、次のようにこれらの接続を簡単にオーバーライド/変更できます。

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

以降、このmysql接続を使用するEloquentモデルは、この新しいデータベース接続構成を使用します。

可能であれば、サービスプロバイダーでこれを行うことをお勧めします。

21
jszobody

同じ問題に遭遇しました。

実行時にデータベース設定を実際に変更して使用できます。

Config()関数を使用して、追加の設定を行うか、既存の接続設定を上書きします。

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

これらの設定はキャッシュされることに注意してください。新しい設定を使用する必要がある場合は、使用する接続のDBキャッシュを削除してください。

DB::purge('mynewconnection');

使用されるデフォルトの接続を操作することもできます。これは、異なる接続で移行を使用し、使用された接続内の移行テーブルでそれらを追跡したい場合に便利です。またはもちろん他のクールなもの...

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

複数のMS Access DBファイルをMySQLにインポートするスクリプトでこの問題にも遭遇し、実行時に構成を編集することを提案するソリューションのいずれにも満足できませんでした。インポートしたいすべてのAccess DBファイルに対して新しい構成を動的に作成するのは、醜くて面倒でした。少し遊んだ後、私はLaravelを説得して次のように既存の接続のDBを切り替えるように説得しました。

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