CakePHP Note (v1.3) > モデル > アソシエーション

アソシエーション

アソシエーションは関連レコードの取り扱いを容易にするための機能です。モデルにアソシエーションを設定しておくとモデルがデータを取得する時に関連するテーブルを結合したり、追加のSQLを発行したりして関連するレコードも取得してくれます。

アソシエーションのタイプ

  • hasOne(ひつの関連レコードを持つ:1対1)
  • hasMany(複数の関連レコードを持つ1対多)
  • belongsTo(1つの親レコードに所属する:1対1)
  • hasAndBelongsToMany(別の親レコードにも所属する複数の関連レコードを持つ:多対多)


hasAndBelongsToManyはちょっとややこしいです。HABTMと省略して呼ばれる事もあります。例としてはタグ機能のあるブログ・システムがあります。ブログの記事とタグの関係つまりpostsテーブルとtagsテーブルの関係がhasAndBelongsToManyです。これを管理するのに中間テーブルとして、posts_tagsテーブルを使用します。

アソシエーションを設定する

モデルにアソシエーションを追加するには、モデルの属性に設定します。最もシンプルなやり方は、モデル名を指定する方法です。外部キーや結合条件など詳細に設定する事も出来ます。命名規則に従っていれば外部キーを設定する必要がありません。

class User extends AppModel {
    var $hasOne = array('Profile');
    var $hasMany = array('Comment'=>array('limit'=>5));
    var $belongsTo = array('Group');
}

hasOne

以下のキーを設定出来ます。
className, foreignKey, conditions, fields, dependent(bool)

hasMany

少なくともlimitキーで最大取得レコード数を設定しないとデータを取得出来ません。
その他以下のキーを設定出来ます。
className, foreignKey, conditions, fields, order, limit, offset, dependent, exclusive, finderQuery

belongsTo

以下のキーを設定出来ます。
className, foreignKey, conditions, fields, counterCache(bool)

hasAndBelongsToMany

hasAndBelongsToManyの場合は、'with'パラメータに中間モデルを指定します。

class Post extends AppModel {
    var $hasAndBelongsToMany = array('Tag' => array('className' => 'Tag','with' => 'PostsTag'));
}

アソシエーションによる再帰的なデータ取得

一度の検索で自動的に関連レコードを再帰的に取得してゆく事が可能です。これが便利なときもあればパフォーマンスを低下させてしまう事もあります。検索の際に'recursive'パラメータでレベルを指定します。

アソシエーションの動的管理

必要に応じてアソシエーションを追加したり取り除いたりできるbindModelメソッドとunbindModelメソッドがあります。

テーブルの結合

アソシエーションの設定によらずテーブルを結合させたい場合は、検索の際のパラメータ'joins'を使用します。

CakePHP Note (v1.3)

Index