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を書いたほうが良い気もするけれど