• ガンダムのアニメ新作が準備中ということでわくわくしながらキーを叩くteruchiです。

    CakePHPで、モデルをbelongsToとかで関連付けしてて、
    2階層目のモデルも一緒に引っ張ってきたい時ってありません?

    たとえば、

    Book belongsTo Shop
    Shop belongsTo City

    みたいにつながってる状態で、
    本(Book)を検索すると本屋さん(Shop)がある街の名前(City.name)も引っ張ってきたいなんてパターン。

    私はこんな感じでやってます。


    // 本モデルに本屋さんモデルを関連付け
    $this->Book->bindModel(array('belongsTo' => array('Shop')), false);

    // 本屋さんモデルに街モデルと店種別モデルを関連付け
    $this->Book->Shop->bindModel(array('belongsTo' => array('City', 'Type')), false);

    // paginateのオプションにcontainを使って取ってくる情報を絞る
    $this->paginate = array(
    'order' => 'Book.updated DESC',
    'contain' => array('Shop.id' => array('City.name', 'Type.name')));

    $this->set('books', $this->paginate());

    ちょっとよけいなのも付いてますが(w

    ポイントはbindModelの第2パラメーターにfalseを指定すること。
    これでpaginate()に処理が移っても関連付けが外れなくなります。

    あとcontainを使ってShop.idを渡すとこ。
    DBをフェッチする時の情報を減らします。(プチ減量)

    SQLをデバッグするとわかりますが、idの一覧を取ってきて、
    関連付け先は個別にSELECTしてくれます。(それも問題だけど。。。)

    一覧で使う場合はあまりおすすめできないかな。。。

    ちなみにapp_model.phpで

    var $actsAs = array('Containable');

    としてるのが前提です。(これ大事)

    それでは今日も良いコードを。

    Top

Top

コメントの投稿

Gravatar