2012年10月10日水曜日

[CakePHP]アソシエイションを持つモデルをsaveall()する際に受け付けるデータ構造

あるモデルのデータを保存する際、Model::saveall()を使用すれば、
アソシエイションを持つモデルのデータも同時に保存できるのは大変便利だ。

ただし、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 件のコメント:

コメントを投稿