CakePHP で複数のデータベースを使用する
機会があって CakePHP を触ってみた。
PHP は食わず嫌いで触ってなかったけど
CakePHP は Rails のおいしいところを多く持っているので意外に好印象だった。
何より動作が軽快で 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 のみで記述されたファイルの
閉じタグを消してみるといいかも。