【CakePHP2.x】複数のデータベースを使う2015-10-01

例えばプロジェクトごとにデータベースを作っているとか単に複数のデータベースを管理しているとかで、他のデータベースとの接続が必要になる場合があったとする。そういう場合を想定したCakePHPにおける複数のデータベース接続の備忘記録。

【設定】
1.app>config>database.phpに他のデータベースを追加する。
2.(A)Modelのメンバ変数に設定する、か
  (B)Controllerのメソッドで呼び出す
  ※どちらのデータベースのテーブルであってもModelは作っておく

●database.phpへの追加設定
class DATABASE_CONFIG {
   public $default = array( //もともとのデータベース
      'datasource' => 'Database/Mysql',
      'persistent' => false,
     'host' => 'ホスト名',
     'login' => 'ID名',
     'password' => 'パスワード',
     'database' => 'データベース名',
     'prefix' => '',
      'encoding' => 'utf8',
    );

  // ↓これが追加する他のデータベース分

   public $hoge = array( //hogeは別のデータベースで任意
     'datasource' => 'Database/Mysql',
     'persistent' => false,
     'host' => 'ホスト名',
     'login' => 'ID名',
     'password' => 'パスワード',
     'database' => 'データベース名',
      'prefix' => '',
     'encoding' => 'utf8',
    );
 …
 …

●Modelへ設定する場合
public $useDbConfig = 'hoge';
※hogeはdatabase.phpに設定した他のデータベースのメンバ変数名
モデル側で他のデータベースを設定するので、コントローラーはデフォルトのデータベースと同様に扱うことができる。

●Controllerへ設定する場合
コントローラーのメソッドに
$this->Model名->setDataSource('hoge');
※hogeはdatabase.phpに設定した他のデータベースのメンバ変数名
元に戻す場合は
$this->Model名->setDataSource('default');
これで同じメソッド内で元のデータベースが使える。もちろん、コントローラーのメンバ変数に
public $uses = array('Model1', 'Model2', …);
と使用するモデル名を宣言しておくことは必要。

使用後の感想】
使ってみるとModelに設定すると複数のデータベースで同じ名前のテーブルがあった場合にどちらか一方しか使えず、コントローラーのメソッドでデータベースを変える方が小回りが効くと感じた。