ようこそゲストさん

CPA-LABテクニカル

2008/02/15(金) recursiveの隠しオプション

ここでは、recursiveが、多くの人が思うような動作にするための隠しオプションをご紹介する。recursive はややこしい。かなりの人が混乱しているように思う。
ただし、お断りしておくと、このオプションは実は隠されているのでなく、複雑なテーブル間連携を別途記述するためのオプションを流用する、というだけの話です。
できれば、recursiveを正しく理解するを読んでいただいたほうがいいかと思います。

本当は違うけど多くのCakePHP初学者が思い込むパラメータ
recursiv=0 とすると、アソシエーションしているデータはとってこない。
という動作にするにはどうするか。

結論  CakePHP 1.2 ですよ!

まず、結論。
モデルのアソシエーションの記述に以下のように external  を付け加えてください。
他のオプションを設定している方は、それは消去せず、externalオプションだけを付け加えてください。
ただし、決して、 finderQuery オプションは設定してはなりません。


(例)
class Spok extends AppModel{

var $belongsTo = array( 'Kirk' => array( 'extenrl' => true ));

}

すると、recursive=0 の場合、アソシエーションはとってきません。このオプションを設定しない場合の recursive= -1 と同じになります。
もちろん、recursive= 1 にすれば、第1次アソシエーションを取得します。recursive= 2 にすれば、第2次アソシエーションも取得します(以下同様)。

注意!

  1. こうすると、単純な hasOne,belongsTo の連携の場合も、複数回のSQL文を発行します。つまり、パフォーマンスは(かなり)悪くなります。
  2. external = false としても、true と同じ動作をします。このオプションを生かさない場合は、 null または、設定しない、としてください。
  3. この使い方は、externalオプションの本来の使い方ではありません。将来のバージョンアップ時の互換性についてはわかりません。
このオプションは、finderQueryオプションを設定するものです。これは、副問い合わせのサブクエリーをここに記述して、external=trueにしておくと、このサブクエリーを使って、アソシエートする、ということのために用意されているオプションと考えられます。
参考事例
'Virtual' associations Options -googleディスカッション-CakePHP  もうひとつの例-googleディスカッション

図で表すと。。。

クリックすると拡大されます。
recursiveを正しく理解するの図と比べるといいかと。


CakePHP_recursive_attention2.jpg

この件のヒント


すべては、dbo_source.php 内の function read にある。
$external = isset($assocData['external']);
でした。
なんで、こんなことやってんのやろ?と思ったのがすべての始まり。

現実的には


現実的には、このような方法をとるのでなく、正しくrecursiveを理解するのがよいでしょう。データ構造によっては、なんせ、発行するSQL文の量がはんぱじゃないですから。&本来の使い方じゃないですから。
recursiveの正しい使い方は -> recursiveを正しく理解する

名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/082/tb/