以前の記事で、CakePHP3で複数のデータベースへ接続する方法について紹介しました。
今回は、CakePHP2系で複数のデータベースに接続する方法について紹介します。
Contents
app/config/database.phpに複数のDBを定義する
まず、app/config/database.phpにデータベースの定義をします。今回は、複数のデータベースへ接続するため、下記のようになります。
//一つは設定しなきゃだめ class DATABASE_CONFIG { var $default = array( 'driver' => 'mysql', 'persistent' => false, 'host' => '123.123.456.789', 'login' => 'hoge.com', 'password' => 'hoge2012', 'database' => 'hogehoge', 'prefix' => '', 'encoding' => 'utf8', ); //今回追加した別のデータベース var $hoge = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'hoge', 'password' => 'hoge2012', 'database' => 'hoge', 'prefix' => '', 'encoding' => 'utf8', ); }
Modelにデータベースの接続先を記載する場合
モデルでデータベースの接続先を変える場合は下記のようにします。hogeはapp/config/database.phpに設定した他のデータベースのメンバ変数名です。
こうすることで、コントローラでは、デフォルトのデータベースとして接続することができます。
public $useDbConfig = 'hoge';
Contorollerにデータベースの接続先を記載する場合
コントローラでデータベースの接続先を決める場合は、下記のように記載します。
下記の例では、hogeとdefaultのデータベースへ接続しています。
$this->Model->setDataSource('hoge');//DB変更 $this->Model->setDataSource('default');//DBを元に戻す
コンポーネントでDBの接続先を記載する場合
モデル・コントローラとデータベースに接続する方法を紹介しましたが、コンポーネントを使用することもできます。
渡された変数に応じて、データベースの接続先を変更することができます。
function hogehoge_func($hoge) { if($hogehoge == '1'){ $this->controller->List->useDbConfig = 'default'; $this->controller->Item->useDbConfig = 'default'; }elseif($hoge == '2'){ $this->controller->List->useDbConfig = 'hoge'; $this->controller->Item->useDbConfig = 'hoge'; } }
動的にデータベースの接続情報を切り替える例
動的にモデルのデータベースへの接続先を変更したいということがあると思います。下記のようにすることで動的にデータベースの接続先を切り替える方法もあります。下記の例は、ドメインで接続するDBの情報を変更しています。
AppModel
class AppModel extends Model { function __construct() { parent::__construct(); if( strpos(DOMAIN, ".xyz") !== false ) { $this->useDbConfig = 'hoge'; } elseif( strpos(DOMAIN, ".com") !== false ) { $this->useDbConfig = 'default'; } } }
テストやステージなどの環境毎によって接続先のデータベースを変更したい場合などは、上記のようにすると接続先を変更することができます。
上記の例を使用すれば、複数のデータベースへ接続することができます。そのほかにも色々複数のデータベースへ接続する理由があると思うのですが、その解決策になれば幸いです。