LoginSignup
3
4

More than 5 years have passed since last update.

モデルに設定された全アソシエーションを解除する

Last updated at Posted at 2015-03-24

モデルにアソシエーションを設定することはしばしばですが、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();  //商品モデルのアソシエーションを一旦全解除
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4