読者です 読者をやめる 読者になる 読者になる

blogですかい

株式会社Loco Partnersに勤めるエンジニアうちの一人のブログ。仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

CakePHP2でModelのアソシエーションをまとめて外す方法

全て外したいだけなら

$this->Model->recursive = -1;

一旦全て外して、アソシエーションを設定し直したいなら

たくさんのアソシエーションが設定してある。 この場所では1個だけJOINすれば事足りるのだけれど、不要なものを全てunbindModel()するのが面倒。そんな時に

例えば、コントローラの中で

$this->Model->belongsTo = array();
$this->Model->hasMany = array();
$this->Model->hasOne = array();
$this->Model->hasAndBelongsToMany = array();

あるいは、AppModelクラスに次のようなメソッドを定義する

// app/Model/AppModel.php
class AppModel extends Model {
    public function unbindAllAssociation() {
        $this->belongsTo = array();
        $this->hasMany = array();
        $this->hasOne = array();
        $this->hasAndBelongsToMany = array();
    }
}

上の例は少々乱暴な気がしますので

// app/Model/AppModel.php
class AppModel extends Model {
    public function unbindAllAssociations($reset = true) {
        foreach ($this->_associations as $associationName) {
            foreach ($this->{$associationName} as $modelKey => $modelValue) {
                $modelName = is_numeric($modelKey) ? $modelValue : $modelKey;
                $this->unbindModel(array($associationName => array($modelName)), $reset);
            }
        }
    }
}

全てのアソシエーションを外してからModel::bindModel()で必要なモデルを結合すれば良い。

ここまでするなら別のModelを書いたほうが良い気もするけれど