▼ 2008/02/15(金) recursiveの隠しオプション
ここでは、recursiveが、多くの人が思うような動作にするための隠しオプションをご紹介する。recursive はややこしい。かなりの人が混乱しているように思う。
ただし、お断りしておくと、このオプションは実は隠されているのでなく、複雑なテーブル間連携を別途記述するためのオプションを流用する、というだけの話です。
できれば、recursiveを正しく理解するを読んでいただいたほうがいいかと思います。
本当は違うけど多くのCakePHP初学者が思い込むパラメータ
モデルのアソシエーションの記述に以下のように external を付け加えてください。
他のオプションを設定している方は、それは消去せず、externalオプションだけを付け加えてください。
ただし、決して、 finderQuery オプションは設定してはなりません。
(例)
すると、recursive=0 の場合、アソシエーションはとってきません。このオプションを設定しない場合の recursive= -1 と同じになります。
もちろん、recursive= 1 にすれば、第1次アソシエーションを取得します。recursive= 2 にすれば、第2次アソシエーションも取得します(以下同様)。
参考事例
'Virtual' associations Options -googleディスカッション-CakePHP もうひとつの例-googleディスカッション
recursiveを正しく理解するの図と比べるといいかと。

すべては、dbo_source.php 内の function read にある。
なんで、こんなことやってんのやろ?と思ったのがすべての始まり。
現実的には、このような方法をとるのでなく、正しくrecursiveを理解するのがよいでしょう。データ構造によっては、なんせ、発行するSQL文の量がはんぱじゃないですから。&本来の使い方じゃないですから。
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次アソシエーションも取得します(以下同様)。
注意!
- こうすると、単純な hasOne,belongsTo の連携の場合も、複数回のSQL文を発行します。つまり、パフォーマンスは(かなり)悪くなります。
- external = false としても、true と同じ動作をします。このオプションを生かさない場合は、 null または、設定しない、としてください。
- この使い方は、externalオプションの本来の使い方ではありません。将来のバージョンアップ時の互換性についてはわかりません。
参考事例
'Virtual' associations Options -googleディスカッション-CakePHP もうひとつの例-googleディスカッション
図で表すと。。。
クリックすると拡大されます。recursiveを正しく理解するの図と比べるといいかと。
この件のヒント
すべては、dbo_source.php 内の function read にある。
$external = isset($assocData['external']);でした。
なんで、こんなことやってんのやろ?と思ったのがすべての始まり。
現実的には
現実的には、このような方法をとるのでなく、正しくrecursiveを理解するのがよいでしょう。データ構造によっては、なんせ、発行するSQL文の量がはんぱじゃないですから。&本来の使い方じゃないですから。
recursiveの正しい使い方は -> recursiveを正しく理解する
▼ コメント(0件)
- TB-URL http://www.cpa-lab.com/tech/082/tb/