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'を使用します。
[ 広告: CakePHPによる実践Webアプリケーション開発 ]
