2012年9月11日火曜日

[CakePHP]HABTMでの中間テーブルを使用する際の注意点

以下のサイトで示唆されているとおり、HABTMのアソシエイションは
中間的なモデルを作成し、そのテーブルから二つのテーブルへそれぞれ
belongsToを張り、モデル操作を行う際はこの中間モデルを通じて操作すれば
きちんとjoinをしたSQLが発行される。

SQLから考える Model::findの使い方

素晴らしいポストなのだが、一点疑問。
なぜ中間的なモデルのクラス名を「GroupUserRelation」としているのだろう。
下記で説明されている命名規則にしたがえば、「GroupsUser」でよいのではないか。

3.7.6.6 hasMany through (The Join Model)

「GroupsUser」とすれば、下記の2行目は不要なのではないか。
class GroupUserRelation extends AppModel {
   public $useTable = 'groups_users';
   public $belongsTo = array(・・・・ 

また、このモデルを使用するコントローラにて下記を設定しないと
「Warning (512): SQL Error: 1054: Unknown column」が発生する。
public $uses ='GroupsUser';

もしかしたら、groups_users_controller.phpだったら必要ないかもしれない。

※CakePHPのバージョンはcakephp-1.3.15-9-gacd25c3
【2012/09/11追記】
あるコントローラで、$usesを使って他のコントローラを指定すると、
scaffoldの動きがおかしくなるようです。
上記の例で言うと、例えばGroupsコントローラに
public $uses ='GroupsUser';

と設定すると、scaffolodにて
「New Group」ボタンを押すと、「New Groups User」画面に
遷移してしまいます。

また、usesにもともとのモデルであるGroupも指定すればよいのかと思い、
public $uses =array('Groups','GroupsUser');
と設定したところ「New Group」ボタンを押すと、「New Groups User」画面に
遷移しましたが、他のモデルを操作するボタンが消えてしまいました。
そこで、Groupモデルがアソシエイションを持つモデルを全て$usesで
指定したのですが、ボタンは現れませんでした。

結論としては、scaffoldの画面を維持しておきたいのなら、
モデルを持つ$コントローラのusesをいじるのではなく、
GroupsUserコントローラを使用して処理を記述するべき。

※CakePHPのバージョンはcakephp-cakephp-1.3.15-9-gacd25c3.zip

0 件のコメント:

コメントを投稿