Help us understand the problem. What is going on with this article?

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

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」を設定することで切り替えが可能です。

接続テスト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away