
【CakePHP2】動的に非CakePHPなデータベースに切り替え、データを取得する方法
2015/01/12
CakePHPで作成しているシステムの中で、別フレームワーク(ZendFramework)で作成されたサイトのデータを読み出す必要に迫られました。
サーバが同じなので、DBに対する接続等は問題ないと思うのですが、動的にデータベースの繰り返を行い、且つ非CakePHPなデータベースに対して処理できるのかってところが疑問だったのですが、結果的には全然問題ありませんでした。
今回はその忘備録です。
なお、CakePHPのバージョンは2.3.10で確認しました。
CakePHP2で動的にDBを切り替える方法
まずは動的にデータベースを切り替える方法から。
元々、CakePHPでは複数のDBを扱うことが出来るので、それほど敷居が高いことではありませんでした。
変更すべきファイルはDB設定の、 app/Config/database.php です。
[php]
class DATABASE_CONFIG {
// メインで使用するDB設定
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'hogehoge',
'password' => 'hogepassword',
'database' => 'hogedb',
'prefix' => 'hg_',
'encoding' => 'utf8',
);
// 新たに追加するDB設定
public $anotherdb = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'mugimugi',
'password' => 'mugipassword',
'database' => 'mugidb',
'prefix' => 'mg_',
'encoding' => 'utf8',
);
}
[/php]
データベースの切り替え(呼び出し)
通常は $default で設定しているDBを使用し、特定のモデルの場合にDBを切り替える、という運用を目指すとすると、モデルファイルに設定変更を記述するのが早いかと思われます。
ということで、以下のようにします。
app/Model/Profile.php
[php]
class Profile extends AppModel
{
var $name = 'Profile';
var $useDbConfig = 'anotherdb'; // DB接続名
var $useTable = 'profile'; // テーブル名(単数形でもOK)
}
[/php]
解説するまでもないですが、「$useDbConfig」で、先ほど database.php で設定した、別DBの設定を読み込んでいるだけです。
もうひとつの、CakePHPの命名規則から外れている単数形のテーブル名の件ですが、その場合は「$useTable」で指定すると扱えるようになります。
ちなみに、今回の処理の際、テーブル名が「tb_mail」という形だったのですが、モデル名をキャメルケースにし、同じようにテーブル名を指定すれば全く問題ありませんでした。
モデルの内容はこんな感じ。
app/Model/TbEmail.php
[php]
class TbEmail extends AppModel
{
var $name = 'TbEmail';
var $useDbConfig = 'anotherdb'; // DB接続名
var $useTable = 'tb_email'; // テーブル名(単数形でもOK)
}
[/php]
さほど手順を踏むでもなく、柔軟に対応が可能。
CakePHPは便利ですね。