[CakePHP] saveAllで複数レコードを一括保存する

CakePHP Pancakes
Creative Commons License photo credit: iogi

CakePHPのお話。モデルのsaveAllメソッドで複数レコードを一括保存する方法を、少しハマってしまったのでメモ。

まずは複数レコードが格納された配列の作成から。

例えばUserモデルの複数レコードを一括で保存したい場合、以下のような構造の配列を用意します。構造が重要なのでこのとおり作成しましょう。

参考までに、ビューのFormヘルパーからコントローラにこのような構造の配列を渡してやるには、以下のようにすればよいです。

最後にsaveAllで一括保存。コントローラで以下のようにすれば上で用意した複数レコードを、一括でデータベースに保存する事ができます。

ここで注意点。以下のように書いてしまうとうまく一括保存できないので注意!ここでハマりました。

説明は以上です。うまく使うと、すごくコードがシンプルにかけるので、使えるシーンでは積極的に活用していきたいですね!
それでは!

  • rm

    サイト大変参考にさせて頂いております。

    cakePHPに関しても、http://kadoppe.com/archives/2011/05/cakephp-saveall-multiple-records.htmlが大変参考になりました。

    1つご質問なのですが、現在、【複数レコードの同時編集】+【新規レコードの追加】を1つのフォームで行う処理を作っているのですが、うまくいかず、、2日間が過ぎました….

    echo $form->input(‘User.0.name’); のように、
    キーを持ったもの【編集】とキーを持たないもの【追加】を同時にサブミットした場合に、

    saveALLで【更新は更新】【追加は追加】で処理する

    というのは、そもそも物理的に無理なのでしょうか…..

  • Pingback: cakePHPでの多対多について()