単独の 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にアクセスできる、ということです。
これで意図したことを実装することができました。