CakePHP2で複数のデータベースに接続してみた

シェアする

フリーランスエンジニアの収入例を見てみる→ フリーエンジニアの案件なら、レバテックフリーランス

以前の記事で、CakePHP3で複数のデータベースへ接続する方法について紹介しました。

CakePHP3で複数のデータベースに接続する方法について紹介しています。

今回は、CakePHP2系で複数のデータベースに接続する方法について紹介します。

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';
        }
    }
}

テストやステージなどの環境毎によって接続先のデータベースを変更したい場合などは、上記のようにすると接続先を変更することができます。

上記の例を使用すれば、複数のデータベースへ接続することができます。そのほかにも色々複数のデータベースへ接続する理由があると思うのですが、その解決策になれば幸いです。

[参考]
cakephpのシステム内で条件によってDBを切り替える

シェアする

フォローする