test

前へ | 次へ

CakePHP Note

アソシエーション

UPDATE:2008.04.06

アソシエーションは関連レコードの取り扱いを容易にするための機能です。モデルにアソシエーションを設定しておくとモデルがデータを取得する時に関連するテーブルを結合したり、追加の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('Post','Comment');
    var $belongsTo = array('Group');
}


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

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

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

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

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

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

テーブルの結合

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