2012年11月26日月曜日

[CakePHP]recursive=2で取得してしまう不要なデータを取り除く

モデルのアソシエイションで多対多を実現するには、以下の2通りの
方法がある。

model Aとmodl Bが多対多である場合、

1.以下のようにHABTMを設定する。
 ・A HABTM B
 ・B HABTM A

2.belongsToとhasManyの関係に分割する。
 ・A hasMany AsB
 ・AsB belongsTo A,B
 ・B hasMany AsB

1の場合も中間テーブルAsBは必要なのだが、
AとBのidしかカラムに設定できず、そのほかの情報が保存できない、
というデメリットがあるため、私は2を使用する時がある。

そのような場合、Model::find()を使用すると、デフォルトだと中間テーブルまで
しかデータを取得してきてくれない。

なので、recursiveに2を設定する。

ただ、それだと、不要なデータまでたくさん取得してきてしまう可能性がある。
例えば上記の2のアソシエイションと同時に

 ・A belongsTo C
 ・C hasMany A

といったアソシエイションも持っている状況でAがカレントのモデルの際に
A->find()を行うと想定する。

すると、取得してくるデータは以下のようになってしまう。

①A
②A->AsB
③A->AsB->B
④A->AsB->A
⑤A->C
⑥A->C->A

④と⑥は重複している情報であり、無駄である。
なので、この場合は、「AsB belongsTo B」と「C hasMany A」というアソシエイションを
unbindModel()にて一時的に解除してあげればよい。

下記のサイトを参考にさせて頂いた。

CakePHP recursive=2で不要な関係データの取り除き方

0 件のコメント:

コメントを投稿