CakePHP、スタースキーマ
他のフレームワークは知らないが、CakePHPってスタースキーマに割と特化されたORマッパーっぽい。
CakePHP の findAll で効率良く recursive
コメント欄から、
belongsToのモデルの情報はrecursive=0で普通に全部とって来ますよ。 この例では最初にfieldsをidとnameに限定してたせいで取れなくなってるだけですね。 fieldsを特に指定しなければ、親テーブルの情報は全部取得されます。 ちなみに、belongsToもはずしたいときはrecursive=-1とするといいです。
ってことで、2テーブル間の関係はまあまあだとしても、
例えば、部 > 課 > 所属員 というテーブル構造・・・スノーフレークスキーマ(だよね、こういうの)の場合、同じ問題が発生してしまって如何ともし難い。
[php]
<?php
class Bu extends AppModel {
var $name = 'Bu';
}
class Ka extends AppModel { var $name = 'Ka'; var $belongsTo = array('Bu'); }
class Member extends AppModel {
var $name = 'Member';
var $belongsTo = array('Ka');
}
?>
[/php]
となった場合(例なので、面倒なのでとりあえずこういう書き方)、Member を 軸にデータを引っ張ろうとすると、
[php]
<?php
$this->Job->findAll($where, null, null, null, 1, 2);
?>[/php]
で、Bu まで引っ張ってこれると思うのだけど、JOIN で全て結合してくれるわけでなく、最初に出した記事と同じような現象が発生する。
どうなのよ、これは?
とりあえず 迂回路。findAll をキャッシュしてしまうとか。
Caching Model Data in CakePHP (Part 2)
Member と Bu を結合できるようにする・・・、Member.bu_id みたいなものを作るってのもないことはないのだろうが。
CakePHPでなくとも、パフォーマンス向上の為に冗長なフィールドを持たなくてはならなくなるケースもあると思うけど。