#has many
主キーが外部参照されている場合。
(デフォではidが主キーとなるが、primaryKeyで変更も可能。)
###定義
直接モデルへまたはbindModelで動的に設定する。
find()などで余計なSQLが流れないよう動的に設定するのが推奨。
モデルへ定義する例
class User extends AppModel{
public $hasMany = ['Comment'];
}
※bindModelは後述。
###取得結果
自身のテーブルと、それに紐づくレコードがひとまとまりで取得されるので単にjoinするよりあとの処理が楽。
(
[User] => Array
(
[id] => 121
[name] => Gwoo the Kungwoo
[created] => 2007-05-01 10:31:01
)
[Comment] => Array
(
[0] => Array
(
[id] => 123
[user_id] => 121
[title] => On Gwoo the Kungwoo
[body] => The Kungwooness is not so Gwooish
[created] => 2006-05-01 10:31:01
)
[1] => Array
(
[id] => 124
[user_id] => 121
[title] => More on Gwoo
[body] => But what of the ‘Nut?
[created] => 2006-05-01 10:41:01
)
)
)
###実行されるSQL
joinではなく自身のテーブルへSQLが発行された後、アソシエーション先へのSQLが実行される。そのため、パフォーマンスに問題あり。自身のテーブルでヒットするレコード数が多い場合は、joinを検討する。
###オプション
$hasMany = array(
'Comment'=>array(
'foreignKey'=>'user_id',//アソシエーション先の外部キー。省略時、小文字のモデル名+id。
'fields'=>['title','body'],//アソシエーション先の取得フィールド
'className'=>'Comment',//アソシエーション先のモデル名
'conditions'=>['del_flg'=>true],//アソシエーション先のフィルタ条件
'order'=>array('created'),//アソシエーション先のorder条件
'dependent'=>false,//trueにすると、紐づくアソシエーション先のレコードも削除する。
'exclusive'=>false,//true に設定すると、関連しているすべてのオブジェクトが一つの SQL ステートメントで削除される。
'finderQuery'=>''//アソシエーションを取り出すために、完全な SQL ステートメントを指定する。?
'limit'=>2//アソシエーション先のlimit条件
)
#belongs to
他のテーブルへ外部参照する。
###定義
直接モデルへまたはbindModelで動的に設定する。
class Order extends AppModel{
public $belongsTo = ['OrderItem'];
}
###取得結果
###実行SQL
アソシエーション先が外部結合で取得される。
###オプション
$belongsTo = array(
'User'=>array(
'foreignKey'=>'user_id',//外部キーとして使う自モデルのフィールド名。
'fields'=>array('user_nm'),//アソシエーション先の取得フィールド
'conditions'=>array(),//アソシエーション先のフィルタ条件。
'type'=>'left',//結合の種別leftかinnerを指定できる。
)
#プログラム中でアソシエーションの設定・解除
###設定
$this->Model->bindModel(array(
'hasMany'=>array('アソシエーション先モデル'),
'belongsTo'=>array('アソシエーション先モデル'),
))
bindModelは一度きりなので恒久的に設定する場合は、第二引数にfalseを設定する。
$this->Model->bindModel(array(
'hasMany'=>array('アソシエーション先モデル'),
'belongsTo'=>array('アソシエーション先モデル'),
),false)
###解除
$this->Model->unbindModel(array(
'hasMany'=>array('アソシエーション先モデル'),
'belongsTo'=>array('アソシエーション先モデル'),
))