2022-05-19に投稿

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にアクセスできる、ということです。

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

参考

Originally published at labor.ewigleere.net
ツイッターでシェア
みんなに共有、忘れないようにメモ

arm-band

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

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント