cakePHP 多段階のアソシエーションができないんだけど?
3、多段階のアソシエーションができないんだけど?
アソシエーションの基本はこちらを参照「 http://d.hatena.ne.jp/takuya15/20071120/1195537015 」
上記を踏まえた上で3段階以上のアソシエーションのやり方です。
テーブルは以下の4つ
- Aテーブル
- Bテーブル
- Cテーブル
- Dテーブル
それぞれの関連性は
A⇒B⇒C
A⇒B⇒D
なので外部キーをそれぞれのテーブルに設定します。
Aテーブル:なし
Bテーブル:A_id
Cテーブル:B_id
Dテーブル:B_id
この状態でAテーブルに対してfindを行うと、A,B,C,Dテーブルの関連データが全て取得できます。
設定だけなので楽ですねw
え、C,Dのデータが取れない???
そうなんです、通常の
$this->A->findAll();
だと、アソシエーションの階層は1段階までです。
もちろん、自分で設定が可能です。
やり方は2パターン
- モデルのrecursive変数に設定
- findの実行時に引数に指定
モデルのrecursive変数に設定
上記のテーブルの場合は、Aテーブルのrecursiveに対して値を設定します。
$this->A->recursive = 2;
値は、取りたい階層分を指定しています。C,Dテーブルまで取りたいので2となります。
また、recursiveのデフォルト値は「1」です。なので、1階層までしか取れません。
findの実行時に引数に指定
find時の引数に指定をしますが、結局は内部的にAモデルのrecursiveを更新しています。
なので、考え方は一緒です。
$this->A->findAll(null,null,null,null,null,2);
マニュアルには、3まで設定可能と書いているので、マックスは3階層までなのかな?(未確認です)
ちなみに、recursiveはモデルのメンバー変数です。
なにが言いたいのかというと、一旦値を設定するとそのオブジェクトを使用する限り使い回されます。
上記のように2と設定すると、後は全て2になります。(当たり前か^^)
なので、始めは2階層まで取りたくて、次は1階層までで良いやという場合は、再度設定してね、
ということです。