LaravelでモデルごとにDB接続先を切り替える方法
生徒
「Laravelで、あるモデルだけ別のデータベースに接続したい場合はどうすればいいですか?」
先生
「Laravelでは、モデルごとに接続するデータベースを指定することができます。$connectionプロパティを使う方法です。」
生徒
「$connectionプロパティって何ですか?」
先生
「モデルがどのデータベース接続を使うかを指定する変数です。これにより、アプリ全体でなく特定のモデルだけ別のDBを使えます。」
生徒
「具体的な例を見せてもらえますか?」
先生
「もちろんです。それでは順を追って説明しましょう。」
1. データベース接続を設定する
まず、Laravelのconfig/database.phpで複数のデータベース接続を定義します。例えば、デフォルトのMySQL接続と、もう一つ別の接続を作る場合は以下のように設定します。
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'secondary' => [
'driver' => 'mysql',
'host' => env('DB_SECOND_HOST', '127.0.0.1'),
'database' => env('DB_SECOND_DATABASE', 'other_db'),
'username' => env('DB_SECOND_USERNAME', 'root'),
'password' => env('DB_SECOND_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
このように'secondary'という接続を追加すると、あとでモデルから使えるようになります。
2. モデルごとに接続先を切り替える
モデルで別の接続を使うには、$connectionプロパティを設定します。
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
// secondary接続を使用
protected $connection = 'secondary';
protected $table = 'orders';
}
このOrderモデルを使ってクエリを実行すると、自動的にsecondary接続先のデータベースが使われます。
3. 接続先を動的に切り替える方法
場合によっては、実行時に接続先を変えたいことがあります。その場合は、setConnectionメソッドを使います。
$order = new Order();
$order->setConnection('mysql'); // デフォルト接続に切り替え
$orders = $order->all();
これにより、モデルインスタンス単位で接続先を切り替えられます。
4. 注意点とポイント
モデルごとの接続切り替えは便利ですが、注意点もあります。
- リレーションで異なる接続を使う場合、Eager LoadingやJoinで想定外の動作になることがある。
- トランザクションは接続ごとに管理されるため、複数接続での一貫性には注意。
- キャッシュやイベントも接続ごとに動作する場合があるので確認が必要。
これらを理解しておくと、モデルごとのデータベース切り替えを安全に行えます。
5. まとめ
Laravelでは$connectionプロパティやsetConnectionメソッドを使うことで、モデルごとにデータベース接続を切り替えることが可能です。これにより、複数のデータベースを扱うアプリケーションでも柔軟にデータ操作ができます。