中間的なモデルを作成し、そのテーブルから二つのテーブルへそれぞれ
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 件のコメント:
コメントを投稿