2011年11月17日木曜日

[CakePHP2.0]モデルのprefixが複数あるテーブルを扱う時

ちょっとCakePHPのプログラムを書いてます。

smartyばっかりだったのでなかなかフレームワークには馴染めませんでしたが、慣れてしまうとsmartyより便利ですね。
コードの量が減った気がします。

さてさて、CakePHPではデータベースのprefixを指定して管理することができます。

prefixと言うと、日本語なら「接頭語」って感じですかね・・例えば、cake_items、cake_prices、cake_details・・・という感じで、頭に必ずついてる「cake_」がprefixになります。
この共通の接頭語を app/Config/database.php のDB設定欄 prefixの値で設定することで、prefixを省略してContrllerの名前を付けたりできるわけです。


public $default = array(
 'datasource' => 'Database/Mysql',
 'persistent' => false,
 'host' => 'localhost',
 'login' => 'login_id',
 'password' => 'login_pass',
 'database' => 'sample',
 'prefix' => 'cake_',
 'encoding' => 'utf8',
);


1つのデータベースでWordpressやCakePHPや何だかんだと複数のアプリを管理している場合に便利ですね。

ところが今回のデータベースは、CakePHP上で扱うデータベースだけど接頭語の種類が複数あるというタイプでした。
例えば、マスターテーブル、アプリ用テーブル、設定用テーブルと種類分けされていて、それぞれに接頭語があるという感じです。
例えば、mst_items、app_histories、st_applications・・といった感じですね。

この場合、prefixを指定せずに、modelの中で使用するテーブル名を設定してもいいと思います。


/**
 * app_historiesテーブル
 */
class History extends AppModel {
    public $name = 'History';
    public $useTable = 'app_histories';
}


でも、今回は、大半がアプリ用テーブルだったので、prefixには 'app_' を設定しています。
この場合、マスターテーブル等のモデルをどうするかと言うと、


/**
 * mst_itemsテーブル
 */
public MstItem extends AppModel {
    public $name = 'MstItem';
    public $tablePrefix = '';
}


として、$tabelPrefix を空白に設定してやるとOKです。
マスターテーブルと分かるように、あえてMstItemという名前にしてますが、Itemとして管理したい場合は、$tablePrefixをmst_にすればいいんじゃないかな。これはやってません。


public Item extends AppModel {
    public $name = 'Item';
    public $tablePrefix = 'mst_';
}


結構柔軟に何でも扱えますね。
バージョン1.2の頃に使ったことがあったけど、バージョン2系になってからは初のCakePHPです。
findAllとか動かなくなってるんですね。
今現在(2011/11/18)まだ2系のリファレンス本は出てないような感じなので、しばらくはネット中心で情報を集めていくしかなさそうです。

0 件のコメント:

コメントを投稿