Seo tools

Neo Inspiration

  • Search

    • About Me

      • inspi 改め
        jakk@webアーキテクト(自称)
        php,javascript,seoなど
        得意技は extract();



  • Categories

  • Ranking

  • Comments

  • Others


  • 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

    2008/11/22 09:41:13