Laravelを使わず、直接PHPからEloquent(illuminate/database)を使用し、かつ複数のDBに接続する方法。

自分でウェブアプリケーションを作る場合、フロントエンドにVueを使用し、サーバ側は素のPHPでRestful風に仕上げるスタイルが好みです。

そうなりますと、サーバー側は要求に応じてjsonデータを返すことが主な役割となりますので、LaravelやRailsなどのフレームワークは無用の長物となりますが、認証やDBを扱う場合は、そういったフレームワークが持つ機能が便利で捨てがたいこともしばしばです。

実は、Laravelの認証やDBの機能は、それだけを単体で使用できることをご存知でしょうか?

今回、DBを扱うにあたり、illuminate/database を使うことにしました。

(※認証系でしたら、sentinelやsentry2あたりが有名ですよね)

インストールの方法については、他のライブラリ同様にcomposerで簡単に導入できますので説明は省略します。

さて、その使い方ですが、illuminate/database単体で使用する方法をググって調べたところ、使い方を詳しく解説するサイトはあいにく見つかりませんでした。今回は複数のDBに接続したいのですが、そういった情報には全く辿り着けず…。

Laravelでの接続方法については、複数DBに関する情報がいくつかありましたので、きっとilluminate/database単体でも出来るはずだろうということで、illuminate/database のソースコードを読んで、複数のDBへ接続して使用する方法を調べてみました。

以下のように指定すればOKでした。

<?php

use Illuminate\Database\Capsule\Manager as Capsule;


include_once('vendor/autoload.php');

// database manager を生成する
$capsule = new Capsule;

// DB1の接続情報を設定する
$capsule->addConnection([
    'driver'    => 'mysql',
    'host'      => 'xxxxx',
    'database'  => 'xxxxx',
    'username'  => 'xxx',
    'password'  => 'xxxxxx',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci'
]);

// DB2の接続情報を設定する
$capsule->addConnection([
    'driver'    => 'mysql',
    'host'      => 'xxxxx',
    'database'  => 'xxxxx',
    'username'  => 'xxx',
    'password'  => 'xxxxxx',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci'
], 'second_db'); // <============ ★名前を付ける!

// 標準では"default"という名称になる

$capsule->setAsGlobal();
$capsule->bootEloquent();

// それぞれのDBに接続する
$db1 = $capsule->connection(); // connection('default')でもOK
$db2 = $capsule->connection('second_db');

// DB1からデータを取得する
$rec1 = $db1->table('users')->get();

// DB2のデータを更新する
$db2->table('users')
    ->where('id', 1)
    ->update(['first_name' => 'taro']);

なかなか便利です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする