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件のコメントがあります。

  1. みず より:

    ContainableComponent を使うともっと便利になりますね
    http://book.cakephp.org/ja/view/474/Containable

  2. akahige より:

    おお、これはいい情報をありがとうございます!

コメントは受け付けていません。