LoginSignup
10
8

More than 5 years have passed since last update.

参照DBを動的に切り替える

Last updated at Posted at 2015-03-24

環境ごとに違う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」を参照するようになります。

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8