Eloquent で複数DBに接続する

単独の Eloquent を利用して異なるデータソースにアクセスしてみたのでメモしておきます。

コード

<?php

declare(strict_types=1);

use Illuminate\Database\Capsule\Manager;

class DBConnection
{
    private $db;

    public function __construct()
    {
        $this->db = new Manager;
        // default
        $this->db->addConnection([
            'driver'    => 'mysql',
            'host'      => $_ENV['MYSQL1_HOST'],
            'database'  => $_ENV['MYSQL1_DBNAME'],
            'username'  => $_ENV['MYSQL1_USER'],
            'password'  => $_ENV['MYSQL1_PASSWORD'],
            'charset'   => 'utf8',
        ]);
        // second
        $this->db->addConnection([
            'driver'    => 'mysql',
            'host'      => $_ENV['MYSQL2_HOST'],
            'database'  => $_ENV['MYSQL2_DBNAME'],
            'username'  => $_ENV['MYSQL2_USER'],
            'password'  => $_ENV['MYSQL2_PASSWORD'],
            'charset'   => 'utf8',
        ],
        'second'); // addConnection() メソッドの第二引数に接続名を指定する (1つ目はなしだと default になる)
        $this->db->setAsGlobal();
        $this->db->bootEloquent();
    }
    // 略
}

肝はコメントにも記した通り Managerクラス の addConnection()メソッド について、第二引数に接続名を指定することです (1つ目はなしだと default になり、後で使用する分にも指定は不要) 。

あ、しれっと書いていますが dotenv を使用した想定です。

$db = new DBConnection();

$secondDBrows = $db->connection('second')->table('hoge_db')
                   ->where( /* 略 */ )
                   ->select( /* 略 */ )
                   ->get();

こちらもしれっと書いていますがイメージとしては先程のDB接続用クラス DBConnection をインスタンス化して、その中から connection()メソッド で引数に先程指定した接続名を記述することで二つ目の接続を利用してDBにアクセスできる、ということです。

これで意図したことを実装することができました。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。