CakePHPでループ中にsaveしたい!
CakePHPでforeachのループ中にsaveしたい!
CakePHPのSaveメソッドはforeachなどのループ中に実行できるの?
「出来るみたいです」
CakePHPのもっとも典型的なSaveメソッドの使い方
CakePHPのsaveメソッドとは、読んで時のごとく
「データをデータベースに保存(save)するメソッド」です。
CakePHPブログチュートリアルだと
CakePHPブログチュートリアルだとこんな風になっています。
function add() { if (!empty($this->data)) { //saveメソッド。saveしたらリダイレクトをしている if ($this->Post->save($this->data)) { $this->flash('Your post has been saved.','/posts'); } } }
つまり、ループ中にsaveを実行すればいいわけだな!
あれれ?ループ中にsaveを繰り返し実行しても、最初のデータしか保存されない!!
何となくループ中にこのようにsaveメソッドを実行しただけでは なぜか最後のデータしか登録されず、全ループ分データが登録されません。
foreach($this->data as $data){ $this->Post->save($data); }
同じような疑問を持つ方が他にいましたよ
回答としては、これを実行してね!とあります。
$this->Model->create(false);
どうやら、ループ中にsaveを行いたい場合は必ずcreateメソッドを実行してあげる必要があるようです。
// Create: idがセットされていない $this->Recipe->create(); $this->Recipe->save($this->request->data); // Update: idに整数値がセットされている $this->Recipe->id = 2; $this->Recipe->save($this->request->data);
createメソッドについては本家にも説明があります。
ループ中のsaveではcreateメソッドを実行するよ
そんなわけでこれらを踏まえてループ中に何度もsaveメソッドを実行するとこうなります。
foreach($this->data as $data){ //saveの前にcreateを実行 $this->Post->create(false); $this->Post->save($data); }
なぜfalseなのか。それはIDがないよ(新規登録だよ)と、いうことと同じことみたいです。なので、
foreach($this->data as $data){ //idはないよ、新規登録だよ という意味に。 $this->Post->id = false; $this->Post->save($data); }
updateの時はどうなるの?
今回の例だと、ループ中にidがセットされていないケースなので、updateの場合はhiddenでidを渡せばOKだよ!
ループでsaveするならcreateメソッド
よく覚えておこう。