システムの規模が大きくなると、複数のデータベースを同時に扱う場合があります。
オンライン系の情報を管理するデータベースと、バッチ系を管理するデータベースを分けて運用したい場合などがあります。
本記事では、Laravelで複数のデータベースを利用する際の設定方法や実践的な活用方法について解説します。
環境設定
.env
複数のデータベースに接続するために、まず.env ファイルを編集します。
それぞれのデータベース接続情報を設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# デフォルトのデータベース接続 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=main_database DB_USERNAME=root DB_PASSWORD=password # ログ用データベース接続 LOG_DB_CONNECTION=mysql LOG_DB_HOST=127.0.0.1 LOG_DB_PORT=3306 LOG_DB_DATABASE=sub_database LOG_DB_USERNAME=root LOG_DB_PASSWORD=password |
config/database.php
config/database.php ファイルを編集し、データベース接続情報を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
'connections' => [ // デフォルトのデータベース接続 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'main_database'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'password'), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], // サブ用データベース接続 'sub_mysql' => [ 'driver' => 'mysql', 'host' => env('LOG_DB_HOST', '127.0.0.1'), 'port' => env('LOG_DB_PORT', '3306'), 'database' => env('LOG_DB_DATABASE', 'sub_database'), 'username' => env('LOG_DB_USERNAME', 'root'), 'password' => env('LOG_DB_PASSWORD', 'password'), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], ], |
設定の確認
設定が完了したら、以下のコマンドでLaravelアプリケーションを再起動し、設定を反映します。
1 |
php artisan config:cache |
クエリビルダーでの使い方
Laravelのクエリビルダーを使用すると、SQL文を直接書かずにデータベース操作を行うことができます。
複数のデータベースを使用する場合、DB::connection() メソッドを用いて接続を切り替えることで、簡単に異なるデータベースを操作できます。
基本的な使い方
DB::connection('接続名') を使用して、特定のデータベース接続を選択できます。
以下は、デフォルトのデータベース(mysql)とログ用データベース(sub_mysql)を切り替えてデータを取得する例です。
1 2 3 4 5 6 7 |
use Illuminate\Support\Facades\DB; // デフォルトデータベースからデータを取得 $users = DB::connection('mysql')->table('users')->get(); // サブ用データベースからデータを取得 $logs = DB::connection('sub_mysql')->table('logs')->get(); |
connection('接続名') で接続を明示することができます。
table('テーブル名') で、操作対象のテーブルを指定します。
データ挿入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// デフォルトデータベースにユーザーを追加 DB::connection('mysql')->table('users')->insert([ 'name' => 'Hoge', 'email' => 'hoge@example.com', 'created_at' => now(), 'updated_at' => now(), ]); // ログデータベースにログを追加 DB::connection('dub_mysql')->table('logs')->insert([ 'event' => 'User Created', 'user_id' => 1, 'created_at' => now(), ]); |
Eloquentでの使い方
Eloquentは、LaravelのORM(Object-Relational Mapping)機能で、データベース操作をモデルを通じて直感的に行える強力なツールです。複数のデータベースを操作する場合でも、モデルに適切な接続を指定するだけで簡単に利用できます。
モデルで接続を指定
複数のデータベースを扱う際、モデルの $connection プロパティで接続を指定します。
例として、users テーブルと log テーブルを、それぞれ異なるデータベースで管理する場合のモデルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $connection = 'mysql'; // デフォルトデータベース protected $table = 'users'; // テーブル名 } class Log extends Model { protected $connection = 'Sub_mysql'; // ログ用データベース protected $table = 'logs'; // テーブル名 } |
$connection プロパティにデータベース接続名を設定します。
$table プロパティでテーブル名を指定できます。
データの取得
1 2 3 4 5 |
// デフォルトデータベースからユーザーを取得 $users = User::all(); // ログ用データベースからログを取得 $logs = Log::where('event', 'User Created')->get(); |
データの保存
1 2 3 4 5 6 7 8 9 10 11 |
// 新しいユーザーを保存 $user = new User(); $user->name = 'Hoge'; $user->email = 'hoge@example.com'; $user->save(); // 新しいログを保存 $log = new Log(); $log->event = 'User Registered'; $log->user_id = $user->id; $log->save(); |
リレーションの設定
Eloquentではリレーションを利用できますが、異なるデータベース間のリレーションは直接サポートされていません。
そのため、手動でリレーションを扱う必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class User extends Model { protected $connection = 'mysql'; // ログを取得するカスタムメソッド public function logs() { return Log::where('user_id', $this->id)->get(); } } class Log extends Model { protected $connection = 'sub_mysql'; } |
マイグレーションの実行
特定のデータベースでマイグレーションを実行する
Laravelでは、--database オプションを使用して、特定のデータベース接続を指定できます。
以下は、sub_mysql 接続に対してマイグレーションを実行する例です。
1 |
php artisan migrate --database=sub_mysql |
このコマンドを実行すると、sub_mysql 接続に設定されたデータベースでマイグレーションが実行されます。
データベースごとのディレクトリを作成
database/migrations ディレクトリ内に、接続ごとのサブディレクトリを作成します。
1 2 |
mkdir -p database/migrations/main mkdir -p database/migrations/sub |
ブディレクトリに分けた場合でも、--pathオプションを使用して特定のディレクトリのみを対象にマイグレーションを実行できます。
1 2 |
php artisan migrate --database=mysql --path=database/migrations/main php artisan migrate --database=sub_mysql --path=database/migrations/sub |