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メソッド
よく覚えておこう。