CakePHP で複数のデータベースを使用する

機会があって CakePHP を触ってみた。
PHP は食わず嫌いで触ってなかったけど
CakePHPRails のおいしいところを多く持っているので意外に好印象だった。
何より動作が軽快で FastCGI 等を使わなくても十分に実用可能なのが嬉しい。


アプリケーションを開発していて、デフォルトのデータベースとは別に
ユーザ情報だけ別の(既存の)データベースを使いたいと思った。
こんな時でもフレームワークソースコードを変更することなく
実現可能な CakePHP に感心した。


以下に方法をメモしておく。
CakePHP のバージョンは 1.1.18.5850。

方法

app/config/database.php に使用したいデータベースの設定を追加する。

<?php
class DATABASE_CONFIG
{
    var $default = array('driver' => 'mysql',
                                'connect' => 'mysql_connect',
                                'host' => 'localhost',
                                'login' => 'user',
                                'password' => 'pass',
                                'database' => 'app_db',
                                'prefix' => '');

    var $userdb = array('driver' => 'mysql',
                                'connect' => 'mysql_connect',
                                'host' => 'localhost',
                                'login' => 'username',
                                'password' => 'password',
                                'database' => 'user_db',
                                'prefix' => '');
}


別のデータベースを利用するモデルで $useDBConfig を指定する。

<?php
class User extends AppModel
{
    var $name = 'User';
    var $useDbConfig = 'userdb';
    var $useTable = 'user';
    var $primaryKey = 'user_id';
}

既存のデータベースではテーブル名等が CakePHP命名規則に従っていない場合があるため
上の例では $useTable や $primaryKey 等の変数で命名規則に従っていないところを指定している。

おまけ

きっと PHP ユーザには当たり前の話だろうけど
上のコードで閉じタグ "?>" が無いのは意図的なものである。
これは、閉じタグの後ろにホワイトスペース等が入ると redirect() に失敗することがあるため。
参照:WebサイトやCMSの静的化を御支援するfeedtailor社長ブログ


ちなみにエラーメッセージは以下の感じで出る。

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\xxx\app\models\user.php:12) in C:\xampp\htdocs\xxx\cake\libs\controller\controller.php on line 447

リダイレクトが同じ症状で失敗する人は PHP のみで記述されたファイルの
閉じタグを消してみるといいかも。