モデルのアソシエイションで多対多を実現するには、以下の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 件のコメント:
コメントを投稿