Laravelを使用していて、複数のデータベースへ接続する必要に迫られることがあると思います。
例えば
・データ分散化の為に物理的にデータベースサーバが異なる場合。
・マスター、スレーブそれぞれのユーザー、パスワードが異なっている場合。
・MySQL, PostgreSQL, SQL Serverなど複数のデータベースを利用する場合。
のような時です・
今回の記事では、Laravelで複数のデータベースへ接続する方法についてMySQLの場合で紹介します。
マスタースレーブ構成を実装したい方は、下記の記事を参照ください。
Laravelで複数のデータベースへ接続する際の設定ファイルを作成する
Laravel5.0以上のバージョンの場合
.env
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=database1 DB_USERNAME=root DB_PASSWORD=secret DB_CONNECTION_SECOND=mysql DB_HOST_SECOND=127.0.0.1 DB_PORT_SECOND=3306 DB_DATABASE_SECOND=database2 DB_USERNAME_SECOND=root DB_PASSWORD_SECOND=secret
config/database.php
'mysql' => [ 'driver' => env('DB_CONNECTION'), 'host' => env('DB_HOST'), 'port' => env('DB_PORT'), 'database' => env('DB_DATABASE'), 'username' => env('DB_USERNAME'), 'password' => env('DB_PASSWORD'), ], 'mysql2' => [ 'driver' => env('DB_CONNECTION_SECOND'), 'host' => env('DB_HOST_SECOND'), 'port' => env('DB_PORT_SECOND'), 'database' => env('DB_DATABASE_SECOND'), 'username' => env('DB_USERNAME_SECOND'), 'password' => env('DB_PASSWORD_SECOND'), ],
Laravel5.0以下の場合
app/config/database.php
return array( 'default' => 'mysql', 'connections' => array( # Primary/Default database connection 'mysql' => array( 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'database1', 'username' => 'root', 'password' => 'secret' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), # Secondary database connection 'mysql2' => array( 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'database2', 'username' => 'root', 'password' => 'secret' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), ), );
Laravelで複数のデータベースに接続する場合には、上記の様に設定ファイルを設定します。
Schema、Query Builder、Eloquent ORMそれぞれでで利用する場合には、下記の様にそれぞれのデータベースに接続し利用します。
Schema/Query Builder/Eloquent ORMで複数のデータベースに接続する
Schemaでデータベースへ接続する方法
Schemaで接続するためには、connection()メソッドを使用します。下記の例では、mysql2のデータベースへ接続しています。
Schema::connection('mysql2')->create('some_table', function($table) { $table->increments('id'): });
Query Builderでデータベースへ接続する方法
Query Builderでデータベースへ接続する際にも、connection()メソッドを使用します。下記の様にする事でデータベースを指定してクエリを実行することができます。
$users = DB::connection('mysql2')->select(...);
Eloquent ORMでデータベースへ接続する方法
を使用し、データベースを指定し、接続する場合は、$connection変数へ接続するデータベースを指定します。
<?php class SomeModel extends Eloquent { protected $connection = 'mysql2'; }
また、Eloquent ORMを使用する場合には、setConnection()メソッドで接続をすることもできます。
下記の例もmysql2のデータベースへ接続しています。
<?php class SomeController extends BaseController { public function someMethod() { $someModel = new SomeModel; $someModel->setConnection('mysql2'); $something = $someModel->find(1); return $something; } }
[参考]
・Laravel 5 multiple database connection.
・Multiple DB Connections in Laravel
今回は、Laravelで複数のデータベースへ接続する方法について紹介しました。
個人レベルの開発では、あまりやらないかもしれませんが、業務では必要になる知識だと思います。
Laraveを使用して複数のデータベースに接続する必要が出た人は参考にしてください。