CakePHP2.x 複数テーブル保存とアソシエーションをもう一度再確認

cake2-9-5-2

再確認というか、あまり理解せずにbakeされるがままに使っていた。
しかし、複数テーブルの一括保存を行うsaveAllを使うときに困ったことが起こった。

AテーブルとBテーブルの内容両方を一括登録する処理で、コントローラはAを使っている時にA.ctpにFromヘルパーでBテーブルの情報を書き込めるようにセットしたが、DBにうまく保存されない現象が起こった。
原因はModelのアソシエーションだったので否が応でも理解が必要になった。

とはいえ、こんがらがるので今回は3つだけ。本当は4つ・・。

hasAndBelongsToMany

これ、長いし複雑なのでペンディング。

まず、bakeすると必ずといっていいほどよく出る2つ。
belongsTo

hasMany

belongsToは自分のテーブルに相手テーブルのidがある場合。
例えばusersテーブルに職業をセットするためのwork_idがあり、マスタはworksテーブルでセットされているなどの連携に使う場合。

次にhasMany。
belongToの逆。
例えばユーザーのこれまで育ってきた都道府県全てなどを登録する場合にprefsテーブルにuser_idをセットしている時などの連携に使う場合。

最後にhasOne。
これは純粋に1対1。
もっと明確に言うと、Aテーブルにb_idがあり、Bテーブルにa_idがあるとき。

では、saveAllで複数テーブルに情報を保存するときは、このアソシエーションの考え方がくるっているとうまく値をセットできない。
今回はAテーブルにもBテーブルにもそれぞれ外部キーのあるhasOneの関係だったけど、bakeするとbelongToとhasManyを書いていた。
hasOneに書き換えると問題なく両テーブルに保存完了。

ちなみにhasManyの関係の場合、複数テーブル、複数レコードという保存になるため、しっかり配列を渡してあげないと保存できない。

echo $this->Form->input('Reply.0.kind');
echo $this->Form->input('Reply.1.kind');

こんな感じにFromヘルパーに書いてあげる。

以上

コメントを書く