2017年2月24日
CakePHP2.x 複数テーブル保存とアソシエーションをもう一度再確認
再確認というか、あまり理解せずに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ヘルパーに書いてあげる。
以上
コメントを書く