こしあん日記 ~写真と猫とサッカーと~

子供たちの記録用にはじめたが、思春期になり写真を撮らせてもらえなくなる。写真と愛猫とサッカーが中心のブログです。

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ヘルパーに書いてあげる。

以上