複数のデータベースを切り替える方法(別データベースを使用する)

CakePHPで複数のデータベースを使用する方法です。
郵便番号や祝日などどのシステムでも変わらないデータを共通のデータベースとした場合などに使用できます。
(祝日は春分の日、秋分の日を自動では計算できません。
春分の日、秋分の日は政府発表により確定する祝日です。)
[参考記事] コマンドやphpMyAdminで複数のデータベースに接続できるユーザーを作成する方法
[参考記事] CakePHPのDB接続情報設定
[参考記事] 『id』以外のプライマリキーのカラム名を使用する方法
[参考記事] 郵便番号データのダウンロードと注意点

/app/config/database.php
に複数の接続設定を記述します。

class DATABASE_CONFIG {

  var $default = array(
    'driver' => 'mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'user',
    'password' => 'password',
    'database' => 'dbname',
    'port' => '3306',
    'prefix' => '',
    'encoding' => 'utf8'
  );

  var $sub = array(
    'driver' => 'mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'user',
    'password' => 'password',
    'database' => 'dbname2',
    'port' => '3306',
    'prefix' => '',
    'encoding' => 'utf8'
  );
}

Modelに記述する場合

defaultが標準で使用されるデータベースになります。

default以外のデータベースを使用するモデルに

var $useDbConfig = "sub";

を追加します。

具体的には次のようになります。

class Samples extends AppModel {
    var $useDbConfig = "sub";
}

Controllersに記述する場合

コントローラ内で一時的に他のデータベースを使用する場合は次のようになります。

class SampleController extends AppController {
    $this->【Model名】->setDataSource('sub');
}

defaultが標準なので、元の接続に戻す場合には、defaultをセットします。

class SampleController extends AppController {
    $this->【Model名】->setDataSource('default');
}

データベースに接続する権限を付与する

他のデータベースに接続する権限がなければ、接続はできません。
[参考記事] コマンドやphpMyAdminで複数のデータベースに接続できるユーザーを作成する方法
編集する特権を与えるにはMySQLでは次のようにします。

GRANT SELECT , INSERT , UPDATE , DELETE ON  `sample¥_db` . * TO  'username'@'%';

この時、『sample¥_db』を『sample_db』としてしまうと、ワイルドカードになり、『samplexdb』というデータベースにも特権を与えてしまうことになります。

関連記事

スポンサーリンク

携帯サイトのmailtoを端末ごとに書き換える関数

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る