Laravel 5.5 で接続先DBを動的に変更する

接続先のDBを動的に変更したい要件があったのですが、少々癖があって解決まで時間がかかったので備忘録としてメモしておきます。

具体的には、接続先ホストがユーザーの入力値によって変更されるとか、そんな感じです。

下記 stackoverflow で議論されているのですが、少々情報が古いので、現在のLTSである ver 5.5 で使えるように適宜脳内変換していきます。

stackoverflow.com

参考

解決までに以下の3ページを参考にしました。

  1. 設定 5.5 Laravel
  2. データベース:利用開始 5.5 Laravel
  3. [Laravel5.1]複数のDBに接続させる

解決までの流れ

  1. 接続先のDBをデフォルトから切り替えるためには、 config/database.php の中にある connections のリスト内から変更先の設定( 'hoge'とする)を選んで、 DB::connection('hoge')->select([SQL]); のようにする
  2. 今回は動的に接続先を変更したいので、ユーザーからの入力値を使って config/database.php 内の connections リストに新しい設定を追加し、それを使用して接続する、と考える
  3. 動的にconfigをセットするためには config ヘルパに配列の形で設定値を渡せばOK。例えば、config/database.php 内の connections リストに foo という接続名の設定を追加したい場合は、 config([database.connections.foo] => [接続先のホスト名、ポート番号などを配列で渡す]); とする
  4. 設定が追加できたら DB::connections('foo')->select([SQL]); で目的達成!

DBファサードを使用するときは use Illuminate\Support\Facades\DB; するのをお忘れなく。

僕はconfig ヘルパに渡す配列の database.connections.foo の辺りでちょっとつまづきました。ドットで繋いでいく、覚えておいたほうが良さそうです。