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モデルなどもアソシエーションがあれば設定