アソシエイションを持つモデルのデータも同時に保存できるのは大変便利だ。
ただし、saveall()の引数に渡すデータの配列構造に決まりがあるので、
それをおさえなくてはならない。
view側のformから送信されたデータはcontroller側では、$this->dataで
取得することができる。
大抵これをそのままsave()やsaveall()に
$this->Model->saveall($this->data);
といった形で渡し保存することができる。
ただ、view側のフォームで適切にデータを構成した場合は良いが、
色々な事情で適切な形でデータを送れない場合がある。
そういった場合は、controller側でデータを構成しなおしてあげて
saveall()に渡してあげればよい。
逆に言えば、その構成にさえしてあげれば、view側からどのようにデータを
送信されても保存ができるということだ。
その「適切なデータ構成」をわかっている範囲で紹介する。
以下はThemeControllerから、$this->Theme->saveall($data);する際の
$dataの配列構造を想定している。
・hasMany
以下はTheme hasMany Itemという関係を持つ場合である。
Itemが複数となっている。
Array ( [Theme] => Array ( [content] => 本 [explanation] => 楽しい本 [user_id] => 4 ) [Item] => Array ( [0] => Array ( [code] => B0017LURGI [point] => 10 ) [1] => Array ( [code] => 4774135038 [point] => 9 ) ) )
これを保存すれば、自動的にItemモデルのレコードに
Themeのidを補填してくれる。
・HABTM(hasAndBelongsToMany)
Theme HABTM Tagの関係である。
Array ( [Theme] => Array ( [content] => 本 [explanation] => 楽しい本 [user_id] => 4 ) [Tag] => Array ( [0] => 2 [1] => 68 ) )
Tagのほうは、プライマリーキーのidの配列である。(これが超重要)
※連想配列ではなく、ただの配列。
このデータをsaveall()で保存すれば、自動的にThemesTagという
中間テーブルにも両モデルのidを組み合わせたレコードを挿入してくれる。
・hasManyとHABTMの両方を持つ場合。
Theme hasMany Item
Theme HABTM Tag
という関係を持つ場合は、上記で紹介した配列を合体させれば
よいだけとなる。
Array ( [Theme] => Array ( [content] => 本 [explanation] => 楽しい本 [user_id] => 4 ) [Item] => Array ( [0] => Array ( [code] => B0017LURGI [point] => 10 ) [1] => Array ( [code] => 4774135038 [point] => 9 ) ) [Tag] => Array ( [0] => 2 [1] => 68 ) )
【課題】
上記のHABTMのモデルのデータ構成は
data[Tag]=array(2,68)
といった形でデータが入っているが、以下のサイトだと
data[Tag][Tag]=array(2,68)
といった形にしないといけないように読める。
どっちでもいけるってことなのかな。
暇な時に試します。
cakePHPの$model->saveにおけるUpdateとInsert
※CakePHPのバージョンはcakephp-cakephp-1.3.15-9-gacd25c3.zip
0 件のコメント:
コメントを投稿