起こった問題
タイトルの通り、Laravelで使用するDBのhostをRead/Weiteで切り替えたい、と思って設定をしていました。
設定後下記を確認して、
>>> config('database.connections.pgsql')
=> [
"read" => [
"host" => [
"postgres2",
],
],
"write" => [
"host" => "postgres",
],
...
反映されてるな、と思って念の為connectionも見てみました。
>>> DB::connection('pgsql::read')->getConfig();
=> [
...,
"host" => "postgres",
]
……あれ?
Readコネクションなのでpostgres2
であって欲しいのに、postgres
が出てきてしまいました。
反映されてないのかな?と思い色々調べたので、備忘録として置いて起きます。
調べたこと
getConfigで参照されるconfigは、Illuminate\Database\Connectors\ConnectionFactory::make
内で、
/**
* Establish a PDO connection based on the configuration.
*
* @param array $config
* @param string|null $name
* @return \Illuminate\Database\Connection
*/
public function make(array $config, $name = null)
{
$config = $this->parseConfig($config, $name);
if (isset($config['read'])) {
return $this->createReadWriteConnection($config);
}
return $this->createSingleConnection($config);
}
createReadWriteConnection
が呼び出され、
/**
* Create a read / write database connection instance.
*
* @param array $config
* @return \Illuminate\Database\Connection
*/
protected function createReadWriteConnection(array $config)
{
$connection = $this->createSingleConnection($this->getWriteConfig($config));
return $connection->setReadPdo($this->createReadPdo($config));
}
その中でwrite用のconfigがセットされてるので、どう呼び出してもwriterのconfigが見える、というオチでした。
まとめ
ReadとWriteでconnectionインスタンスが切り替わってるわけではなさそうで、「Readコネクションの向き先が正しく設定できているかどうか」はDB::connection('pgsql::read')->getConfig();
ではわからない、ということがわかりました。
そのため、config('database.connections.pgsql')
で確認できるhostが分かれていればヨシ!