CakePHPのモデルの過剰なJOINを防止する
CakePHPのモデルはfindすると関連するモデルのテーブルと勝手にJOINしまくる。デフォルトの状態で。
なのでapp_model.phpでそういうことはやめてくれとお願いする。
class AppModel extends Model {
var $recursive = -1;
}
これですべてのモデルで意図せぬJOINはしなくなります。
そのモデルに結びついたレコードだけを持ってくるようになる。
たまにCakePHP遅すぎてつかえねーとか言ってる人もいらっしゃるようですが、ここらへん設定したらもしかしたら解消されるかも知れません。
JOINして欲しい時は明示的に、モデルのメソッドの中なら
$this->recursive = 1;
コントローラやテストコードのメソッドの中なら
$this->ModelName->recursive = 1;
やらするといいでしょう。
またはfindメソッドの引数内で指定することもできます。
ちなみにrecursiveの値次第でどこまでJOINしてデータを持ってくるかというと
- -1 : モデルに結びついたテーブルのデータのみを取得
- 0 : 親(自分がbelongsToしている先)のテーブルのデータも取得する
- 1 : 親と子(自分がhasManyしている先)のテーブルのデータも取得する
- 2 : 親と子と孫(子の子)のテーブルのデータも取得する
デフォルトは1なのでほっとくとJOINしまくってほんと迷惑です。
参考
“CakePHPのモデルの過剰なJOINを防止する” に対して2件のコメントがあります。
コメントは受け付けていません。
ContainableComponent を使うともっと便利になりますね
http://book.cakephp.org/ja/view/474/Containable
おお、これはいい情報をありがとうございます!