Laravelで別々のDB(MySQL)に接続させる方法
経緯
MySQLで部分的に外部DBに接続する必要に迫られたので調査して実践。
config/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」を設定することで切り替えが可能です。
接続テスト
- 外部接続可能なMySQLを作る
- config/database.php を編集する
- Laravel側から接続切り替えできていることを確認する