モデルにアソシエーションを設定することはしばしばですが、Pagenateを使用していたり検索処理を軽くするという理由で場所によってアソシエーションを解除したいってことはあります。
ShopsController.php(修正前)
//商品モデルのアソシエーションを一旦全解除する
$this->Item->unbindModel(array('belongsTo' => array('Maker', 'ItemGenre')));
$this->Item->unbindModel(array('hasMany' => array('Shop')));
:
以前は面倒と思いながらも都度unbindModelを書いてたんですが、以下のようにunbindModelAllを定義すれば楽になります。
アソシエーションが解除されるのは1度のみですが、引数の$resetにfalseを指定すればアクション内で永続的に解除できます。
AppModel.php
public function unbindModelAll($reset = true) {
foreach(array('hasOne','hasMany','belongsTo','hasAndBelongsToMany') as $relation){
$this->unbindModel(array($relation => array_keys($this->$relation)), $reset);
}
}
以下のように、上記で定義したunbindModelAllを実行すれば全アソシエーションを解除することができます。
ShopsController.php(修正後)
$this->Item->unbindModelAll(); //商品モデルのアソシエーションを一旦全解除