CakePHPで複数のデータベースを扱う方法と切り替え ITかあさん

ITかあさん

CakePHPで複数のデータベースを扱う方法と切り替え

CakePHPで複数のデータベースを扱う方法

CakePHPは一つのCakeのアプリケーション内でデータベースを複数扱うことが可能で、
database.phpに配列形式でいくつも設定できます。

データベースの複数定義

app/config/database.php

以下のように全く違う場所にあるデータベースを扱うことも可能です。

  1. //一つは設定しなきゃだめ  
  2. class DATABASE_CONFIG {  
  3.   
  4.     var $default = array(  
  5.         'driver' => 'mysql',  
  6.         'persistent' => false,  
  7.         'host' => '123.123.456.789',  
  8.         'login' => 'hoge.com',  
  9.         'password' => 'hoge2012',  
  10.         'database' => 'hogehoge',  
  11.         'prefix' => '',  
  12.         'encoding' => 'utf8',  
  13.     );  
  14.       
  15. //今回追加した別のデータベース  
  16.     var $hoge = array(  
  17.         'driver' => 'mysql',  
  18.         'persistent' => false,  
  19.         'host' => 'localhost',  
  20.         'login' => 'hoge',  
  21.         'password' => 'hoge2012',  
  22.         'database' => 'hoge',  
  23.         'prefix' => '',  
  24.         'encoding' => 'utf8',  
  25.     );  
  26. }  

各データベースの呼び出し

controllersにDBの切り替えを記述

普段は$defaultを扱い、たまに別のデータベースを扱うならコントローラーに書きます

  1. $this->Model->setDataSource('hoge');//DB変更  
  2. $this->Model->setDataSource('default');//DBを元に戻す  

componentsにDBの切り替えを記述

controllersにデータベースの切り替えが書けるなら、componentsにだって書けます。
変数や渡されたパラメータによってデータベースの切り替えます。

  1. function hoge_func($hoge) {  
  2. if($hoge == '1'){  
  3.     $this->controller->List->useDbConfig = 'default';  
  4.     $this->controller->Item->useDbConfig = 'default';  
  5.     }elseif($hoge == '2'){  
  6.     $this->controller->List->useDbConfig = 'hoge';  
  7.     $this->controller->Item->useDbConfig = 'hoge';  
  8.     }  
  9. }  

ModelにDBの切り替えを記述

これはModel(テーブル名)によって、完全にデータベースを分離させたい時に使えますね。
データベースが肥大化してしまった時などによさそうです。(まあそうなったらデータベースの構造を見直すべきだけど)

  1. class Item extends AppModel{             
  2. var $useDbConfig = 'hoge';  
  3. }  

こんなカンジで簡単にデータベースの切り替えがCakePHPでは行えます。