環境ごとに違うDBを参照させたいということがあります。
テスト環境・ステージング環境・リリース環境や開発メンバー毎に検証環境が異なるといった場合
この場合、アップする環境によってDB設定を書き換えたり差し替えたりするのは面倒この上ないです。
もしくは
アプリの性質上コントローラ側でDBを切り替えたいという場合
複数のDBを参照してひとつのアプリが作られていたり、負荷分散のために切り替える(?)などといったことも無くはないかもです。
かくいう私はテストDBとステージングDBを比較するアプリを作った経験があります。
環境に応じて参照DBが変わるようにしたい
まず前者は以下のようにDB設定(database.php)を定義することで実現できます。
app/Config/database.php
class DATABASE_CONFIG {
public $default = array();
//開発用DB設定
public $develop = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => '開発用DBホスト',
'login' => '開発用DBユーザ名',
'password' => '開発用DBパスワード',
'database' => '開発用DB名',
'prefix' => '',
'encoding' => 'utf8',
);
//リリースDB設定
public $release = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'リリース用DBホスト',
'login' => 'リリース用DBユーザ名',
'password' => 'リリース用DBパスワード',
'database' => 'リリースDB名',
'prefix' => '',
'encoding' => 'utf8',
);
public function __construct() {
//ドメインによって開発用DBとリリース用DBを切り替える
if(strpos(env('HTTP_HOST'), 'develop.xxxx.com') === false){
$this->default = $this->develop;
}else{
$this->default = $this->release;
}
}
}
上記ではドメインがテスト用(develop.xxxx.com)なら開発用DBを、そうでなければリリースDBを参照するように定義しています。
上記のように\$develop、\$releaseに相当する定義を必要数だけ用意し、切り替え条件を環境に応じて自由に(ドメイン以外にドキュメントルートでマッチさせるなど)定義できます。
アプリの性質上、動的にDBを切り替えたい
後者についてはコントローラ内で以下のように変更したいDB定義をsetDataSourceの引数で定義すればOKです。
尚、上述したdatabase.phpで言うと、\$develop、\$releaseがDB定義になります。
ShopsController.php
//Itemモデルを通じてリリース用のDBに参照を動的に切り替える
$this->Item->setDataSource('release');
上記例ですと、切り替え前は「default」設定が参照されている状態ですが、切り替え後から「release」を参照するようになります。