unbindModelとbindModel


unbindmodel と bindmodel と

cakephpを触ってると
意味解らないくらいアソシエーションがあって
こらーー! と思いたくなり。。ました。 実体験です。

最初思っていたのは
「ありったけアソシーエション張って、いらんものは毎回はずす」
というスタンスだったのですが、
毎回Modelみて、これもいらん、これもいらん
見たいな事してるのはだるいなと。

で そうなると毎回必要なものだけ bind するほうがいいのではと考えています。
きれいにやる方法があるならですが。。。

作ってるものにもよりますが、毎回関連するレコード全部必要
なんてこと あんまりないんじゃないかなあ。。
しかもアソシーエション先のModelが3つとかになると、そこは全取得以外できない(と思う)し。

と まあ初級cake流コーディングで悩んでいたわけですが、
こんなところに一つの解決方法がありました。

http://bakery.cakephp.org/articles/view/keeping-bindmodel-and-unbindmodel-out-of-your-controllers

コピペで恐縮ですが、
こんな感じでやるとこうですということで

まずモデルの親クラスの AppModel に

class AppModel extends Model {

  var $assocs = array();
  
  function expects($array) {
    foreach ($array as $assoc) {
      $this->bindModel(
        array($this->assocs[$assoc][‘type’] =>
        array($assoc => $this->assocs[$assoc])));
    }
  }

}

ようは expects というメソッドを作って動的な bind の補助をしてくれるということみたいです。

で Model ではこう宣言

class Title extends AppModel {

  var $assocs = array(
      ’Book’ => array(
        ’type’ => ‘belongsTo’,
        ’className’ => ‘Book’,
        ’foreignKey’ => ‘collection_id’,
      ),
      ’Post’ => array(
        ’type’ => ‘hasMany’,
        ’className’ => ‘Post’,
        ’order’ => ‘Post.id DESC’,
      )
  );
}

$assocs にアソシーエションを突っ込んでいきます。
type のところにアソシエーション部類を突っ込んで、後はクラスや外部キーなど通常のアソシエーションのあれを書く感じ。

最後 Controller で

TitlesController extends AppController {
  function list($id) {
    //必要なだけアソシーエションを expects する
    $this->Title->expects(array(‘Story’, ‘Post’));
    $this->Title->Post->expects(array(‘User’));
    $this->Title->recursive = 2;
    $results = $this->Title->read(null, $id);
  }
}

こうやって必要な分だけ簡単に bind することができます。というお話です。

これを俺は求めていた!!
でも今さら変更とか 変更量が多すぎてミリ。。orz

—-追記

http://bakery.cakephp.org/articles/view/an-improvement-to-unbindmodel-on-model-side

こっちにはもうちょっと凝ったやつが乗っています。
違いは
・Cakeでのコーディングの仕方が変わらないようにしている
・デフォルトは全アソシエーションで、必要なバインドを1個でもつければ全部外れる

ということっぽいです。
ようは、
基本全bind たまにイランのがある ->追記のURL
基本bindなし たまにいろいろバインドする ->一番上のURL

かな。
でも基本全bind なら普通に unbindemodel 使えばいーじゃんという話もありますが。。

まあ検証してるわけじゃないので、それはまた別途。


Leave a Reply