Laravel

[Laravel]Laravelで別々のDB(MySQL)に接続させる方法


Laravelで別々のDB(MySQL)に接続させる方法


経緯

MySQLで部分的に外部DBに接続する必要に迫られたので調査して実践。


Database.php


  • 外部DBの接続情報を追加します

  • デフォルトで接続するDBを見直します。(デフォルト接続先の名前を変更する場合)


まずはデフォルトの状態(MySQL部分のみ抜粋)

'default' => 'mysql',

'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
]
],


修正後(MySQL部分のみ抜粋)

'default' => 'mysql_one',

'connections' => [
'mysql_one' => [
'driver' => 'mysql',
'host' => env('DB_HOST_ONE', 'localhost'),
'database' => env('DB_DATABASE_ONE', 'forge'),
'username' => env('DB_USERNAME_ONE', 'forge'),
'password' => env('DB_PASSWORD_ONE', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
'mysql_two' => [
'driver' => 'mysql',
'host' => env('DB_HOST_TWO', 'localhost'),
'database' => env('DB_DATABASE_TWO', 'forge'),
'username' => env('DB_USERNAME_TWO', 'forge'),
'password' => env('DB_PASSWORD_TWO', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
],


  • mysql_twoを新たに接続先として追加しました

  • 識別しやすいようにデフォルトの名前を変更しました

  • env()で取得している値は「.env」ファイルに設定しています

  • デフォルトの接続先は「mysql_one」で設定しています


    • これにより接続先を明示しない限り「mysql_one」で繋がります



これにて設定は完了です。


コード上での接続切り替え

上記設定で接続先を増やすことができました。


次は実際の切り替え方法を記載しています。


今回は以下2つのDB操作について記載します。


クエリビルダーでの切り替え

SELECTする場合を例にします。


mysql_one(デフォルトDB)

DB::select('select * from users');

mysql_oneはデフォルト接続先に指定しているので、


何も明示せずとも接続が可能となっています。


勿論明示しての接続もできます。

DB::connection('mysql_one')->select('select * from users');


mysql_two(外部DB)

DB::connection('mysql_two')->select('select * from members');

mysql_twoについては接続先を明示する必要があります。


上記で接続可能となっています。


Eloquentでの切り替え


mysql_one(デフォルトDB)

とくに必要ありません。


mysql_two(外部DB)

class Members extends Model

{
protected $connection = 'mysql_two';
}

プロパティ「$connection」を設定することで切り替えが可能です。


接続テスト