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でなくとも、パフォーマンス向上の為に冗長なフィールドを持たなくてはならなくなるケースもあると思うけど。