【CakePHP2】動的に非CakePHPなデータベースに切り替え、データを取得する方法
2015/01/12
CakePHPで作成しているシステムの中で、別フレームワーク(ZendFramework)で作成されたサイトのデータを読み出す必要に迫られました。
サーバが同じなので、DBに対する接続等は問題ないと思うのですが、動的にデータベースの繰り返を行い、且つ非CakePHPなデータベースに対して処理できるのかってところが疑問だったのですが、結果的には全然問題ありませんでした。
今回はその忘備録です。
なお、CakePHPのバージョンは2.3.10で確認しました。
CakePHP2で動的にDBを切り替える方法
まずは動的にデータベースを切り替える方法から。
元々、CakePHPでは複数のDBを扱うことが出来るので、それほど敷居が高いことではありませんでした。
変更すべきファイルはDB設定の、 app/Config/database.php です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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', ); } |
データベースの切り替え(呼び出し)
通常は $default で設定しているDBを使用し、特定のモデルの場合にDBを切り替える、という運用を目指すとすると、モデルファイルに設定変更を記述するのが早いかと思われます。
ということで、以下のようにします。
app/Model/Profile.php
1 2 3 4 5 6 7 |
class Profile extends AppModel { var $name = 'Profile'; var $useDbConfig = 'anotherdb'; // DB接続名 var $useTable = 'profile'; // テーブル名(単数形でもOK) } |
解説するまでもないですが、「$useDbConfig」で、先ほど database.php で設定した、別DBの設定を読み込んでいるだけです。
もうひとつの、CakePHPの命名規則から外れている単数形のテーブル名の件ですが、その場合は「$useTable」で指定すると扱えるようになります。
ちなみに、今回の処理の際、テーブル名が「tb_mail」という形だったのですが、モデル名をキャメルケースにし、同じようにテーブル名を指定すれば全く問題ありませんでした。
モデルの内容はこんな感じ。
app/Model/TbEmail.php
1 2 3 4 5 6 7 |
class TbEmail extends AppModel { var $name = 'TbEmail'; var $useDbConfig = 'anotherdb'; // DB接続名 var $useTable = 'tb_email'; // テーブル名(単数形でもOK) } |
さほど手順を踏むでもなく、柔軟に対応が可能。
CakePHPは便利ですね。