cake PHP モデルにアソシエーションを書くと全てアソシエーションされるんだけど、もっと簡単にできないの?

4、モデルにアソシエーションを書くと全てアソシエーションされるんだけど、もっと簡単にできないの?

モデルに定義するだけで、関連するデータをfindで取得できるのが、アソシエーションの利点です。
(日本語マニュアル:http://cakephp.jp/doc/ch06s04.html
、そんなにいらない場合が多々あります。


例えば
Aテーブルに対して関連するテーブルが、B、C、Dの3つあるとする。

そのうちBとCだけ必要な場合、どうしよう?となります。


動的にfindするときに指定できれば、便利ですよね。


cakePHPには動的に選択する機能があります。モデルの関数の
Model::bindModel( $params )
Model::unbindModel( $params )

こちらの詳しい解説を見つけました。(http://www.blueocean.bz/blog/cakephp/archives/14

ちょっと手の込んだやり方 便利です!!

元ネタがどこかのサイトなのですが、URLを忘れてしまいました^^;
主に私はこのやり方でやってます。
簡単に説明すると、コントローラーで都度、使用するアソシエーションを設定します

いじるソース
 ・コントローラー
 ・モデル
 ・app_model.php

コントローラーの定義方法

モデルのexpects関数(自作)にて使用する、アソシエーションを指定します。
上記の例でいくと、このような定義方法になります。
Aテーブルに対してB,Cテーブルのみアソシエーション

$this->A->expects(array('B','C'));


2段階以上のアソシエーションが必要な場合は、前回(http://d.hatena.ne.jp/takuya15/20071211/1197343801)のように、recursiveで指定してください。

$this->A->expects(array('B','C'));
$this->A->B->expects(array('D'));
$this->A->B->D->expects(array('E'));

$this->A->recursive = 3;
モデルでのアソシエーション定義

通常は、$hasOneなどのアソシエーション毎のメンバー変数を定義しますが、ここではAモデルを

public $assocs    = array(
    'B' =>
        array(
              // アソシエーション名(hasOne,hasMany,belongsTo,hasAndBelongsToMany)
              'type'         => 'hasOne',
              // ここから下のキーと値は、通常のアソシエーションと同じ
              'className'    => 'B',
              'order'        => '',
        ),
    'C' =>
        array('type'         => 'hasMany',
              'className'    => 'C',
              'order'        => '',
              'conditions'   => '',
        ),
    'D' =>
        array('type'         => 'belongsTo',
              'className'    => 'D',
              'order'        => '',
              'conditions'   => '',
        ),
);

$assocsの名前には、好きなようにしてください。次のapp_model.phpで使用するだけです。

同じように、B,Cモデルなどもアソシエーションがあれば設定

app_model.phpの修正

ここで、マジックを仕込みます。

まず、cake/app_model.php を app/app_model.php にコピー。
app/app_model.phpに対して以下を追加

    // アソシエーションの設定
    public function expects($array) {
        foreach ($array as $assoc) {
            $this->bindModel( 
                array($this->assocs[$assoc]['type'] => 
                    array($assoc => $this->assocs[$assoc]))); 
        } 
    }