CakePHPでループ中にsaveしたい! ITかあさん

ITかあさん

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メソッド

よく覚えておこう。

初夏のJavaScript祭 in サーキュレーションビル ForPro