Laravel

LaravelのModelを条件によって接続先を変更する

プロジェクトによって、全く同じデーターベース構造を持ったものが複数ある場合ってありませんか?

Laravelでは基本1テーブルに対して、1Model前提になっています。
その通りにモデルを作成すると、全く同じモデルをデータベースごとに作成する必要があります。

実際にどのようにするのかというと結論だけ書くと以下です。

使用するモデルの前に「on」で指定する

以下では実際に通常の使い方、onを使用してデータベースを指定する方法両方のコードを記入し、説明していきます。

データ取得時にモデルの接続先データベースを変更させる方法

今回はStaffモデルがあるとします。
通常の時と、データベースを指定するときは「on」を使用して、以下のように書きます。

// 通常の全てを取得する
Staff::all();

// データベースを指定して全てを取得
String $database = '接続したいデータベース名を設定';
Staff::on($database)->all();

使用したいモデルインスタンスの後に「on(データベース名)」を追加することで接続先を変更することができて、updateやinsertの時も同じです。

データベースごとにトランザクションを作る方法

データベース更新時のトランザクションもデータベース指定行うことができます。

通常の書き方で「DB」を使用する場合、Laravelの「config/database.php」で指定したデフォルトのデータベースに接続されているようになっています。
なので、Model自体にデフォルト以外のデータベースを参照している場合であってもデータベース指定してトランザクションを張る必要があります。

トランザクションは、begintTransaction,commit,rollback関数などを使用して書きます。
まずは「通常」のトランザクションの書き方はこのようになります。
※トランザクションの書き方には2通りあります

// これを使用するclass上部に追加します
use DB;


/** 
 * 手動でトランザクションを処理する場合
 **/
try {
  $database = (string) '接続したいデータベース名を設定';
  DB::beginTransaction();
  // データベース操作
  // ...
  DB::commit();
} catch (\Exception $e) {
  DB::rollBack();
  // 例外処理
  // ...
}

/** 
 * 短く1行のみで行いたい場合
 * データベース操作でエラーが起きるとロールバックする
 **/
$retryCount = (int) 5; // リトライ回数を設定できます
DB::transaction(function () {
  // データベース操作
  // ...
}, $retryCount);

次にデータベースごとにトランザクションを分ける場合はこのようになります。

// これを使用するclass上部に追加します
use DB;

/** 
 * 手動でトランザクションを処理する場合
 **/
try {
  $database = (string) '接続したいデータベース名を設定';
  DB::on($database)->beginTransaction();
  // データベース操作
  // ...
  DB::commit();
} catch (\Exception $e) {
  DB::rollBack();
  // 例外処理
  // ...
}

/** 
 * 短く1行のみで行いたい場合
 * データベース操作でエラーが起きるとロールバックする
 **/
$retryCount = (int) 5;
$database = (string) '接続したいデータベース名を設定';
DB::on($database)->transaction(function () {
  // データベース操作
  // ...
}, $retryCount);

取得の時と同様に「on」を使用して、接続するデータベースを変更することができるようになっています。

LaravelのModelを条件によって接続先を変更する まとめ

データベース指定するときは「on」を使用する

改めてLaravelでモデル使用時やトランザクションを使用する方法をまとめると上記になります。

非常に簡単に複数データーベースを切り替えられるので、複数データベースを使用するプロジェクトでも導入しやすいかと思います。
使う機会があれば使用してみて下さい。

-Laravel
-, , ,