読者です 読者をやめる 読者になる 読者になる

【CakePHP 2.x】【saveの種類】Model の saveMany(), saveAssociated(), saveAll() を比較する

今まで、CakePHP の データ保存では save() しか使っていなかった。
理由は save() だけ使えば何とかなるので、
View とか Controller の機能を勉強することが多かったから。
ただ、前から saveMany() とか色々と便利なのがあるのは知っていたので、
調べてみた。

まずは簡単にまとめ。

1.saveMany()
単一モデルのデータをまとめて保存できる。
save() を ループで回す必要がなくなる。
deepオプションを true にすることでアソシエーションも保存できる。

2.saveAssociated()
アソシエーションを含むのデータ構造をまとめて保存できる。
deepオプションを true にすることで1階層以上のアソシエーションも保存できる。

3.saveAll()
saveMany() と saveAssociated() のラッパー。
保存対象データ配列の添字が数字であれば、saveMany() を実行し、
文字列であれば、saveAssociated()を実行する。
オプションは saveMany(), saveAssociated() と一緒なので、
deepオプションが使える。


公式サイトにもっと詳しい説明が載ってます。
http://book.cakephp.org/2.0/ja/models/saving-your-data.html


ここで、疑問に思ったのが、deepオプションの存在。
saveMany() は単一モデルをまとめて保存するメソッドだが、
deepオプションを true にすると、
アソシエーション保存も可能・・・。
saveAssociated() 使う必要あるのか・・・?
それとも、saveMany() の deepオプションは1階層アソシエーションしか保存されないのか・・・。

ということで、調べてみた結果を箇条書きでまとめる。

・saveMany() でdeepオプションを true にすると、アソシエーションデータが保存できる。
  2階層でも問題ないので、階層制限はなさそう。
  ただ、単体データは保存できない。
  あくまで複数データ(配列)のみが対象。

・saveAssociated() では多階層アソシエーションデータの保存はできるが、
  複数データを一括保存できない。
  つまり、ループで回す必要がある。

・ saveAll() ではdeepオプションを true にすると、
  何でも保存できる。
  saveMany() と saveAssociated() のいいとこ取り。

つまり、saveAll() を使っとけばいいかなと・・・。

最初は saveMany() でdeepオプションをtrueにすれば、
アソシエーションデータも保存可能なので、
saveMany() だけでいいかと思ったけど、
単体データが保存できなかった。
あくまで複数データを保存するメソッドらしい。

saveAssociated() は単体データが保存保存できるが、
複数データを一括で登録することはできない。

saveAll() は全部OKなので、saveAll() 使っとけばいいと思う。