CakePHPのモデルの過剰なJOINを防止する

2010-04-14
2011-01-08
かなり古い記事です。現在も有効な内容であるかどうか分かりませんのでご注意ください。

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しまくってほんと迷惑です。

参考

Profile

フルスタック気味のフリーランスプログラマー。

どちらかと言うと得意はインフラ構築とサーバーサイドプログラミングですが、フロントエンドもぼちぼちやっています。

最近の興味範囲はWordPress、AWS、サーバーレス、UIデザイン。

愛車はセロー。カメラはペンタックス。旅好きです。横浜在住。