いまさらながらCakeのリレーションについての復習。
基本から。
基本的なリレーション
下記のようなテーブル構成になっていたとします。
ある予約管理システムを作っており、必要な情報は「誰がどこにいつとまるか」の情報です。
誰=人をUser、場所をRoom、そして予約データ自体をReserveで管理します。
1対N
UserやRoomから見た場合、reserveは1対Nになります。
Userの1レコードを取得すれば複数の予約レコードが取得できるからです。(Room)に関しても同様。
もしUserのレコードを取得したときに、reserveも一緒に紐づけて取得したい場合は、Userモデルに
public $hasMany = array('Reserve') などと書きます。
N対1
逆にReserveから見るとUserやRoomは逆の関係になるのでN対1です。
Reserveのレコードを取得したときに、UserやRoomも取得したい場合は、Reserveに
public $belongsTo = array('User','Room') と書きます。
動的な紐づけ
Cakeで上記のような設定をしておくと、自動的にレコードを紐づけて取得することができます。しかし常にレコードが紐づいているとスピードが劣化するなどの問題もあり、時には外したくなることもあるでしょう。
そのような場合は、下記のように書くことで一時的にJOINをはずすことができます。もちろんいつもは紐づけていないけれども動的に紐づけを行いたい、などもすることができます。
1 |
$this->User->unbindModel(array('hasMany'=>array('Reserve')), false) |
参考リンク
http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html