WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

Eloquentで新しいインスタンスをupdateするときは要注意

   

Eloquentで新しいインスタンスをupdateするときは要注意

EloquentはLaravelの標準ORMだが、updateメソッドを使うときは注意が必要。
まず既存レコードのインスタンスでupdateを実行する例。

public function putUpdate($id)
{
    // ...
    $this->info = Info::find($id);
    $info_attributes = Input::only('title', 'content');  // ['title' => 'foo', 'content' => 'bar']
    $this->info->update($info_attributes);               // 真偽値が返ってくる
}

これは期待通り動く。
$this->infoの’title’が’foo’に、’content’が’bar’に更新される。もちろん更新されるのはこのレコードだけで、他のレコードには影響はない。

しかし、新しいインスタンスでこれを実行すると意図しない結果になる。

public function putUpdate($id)
{
    // ...
    $this->info = new Info;
    $info_attributes = Input::only('title', 'content');  // ['title' => 'foo', 'content' => 'bar']
    $this->info->update($info_attributes);               // 更新されたレコードの数が返ってくる
}

なんとすべてのレコードが更新対象となってしまう。
返り値も既存レコードのときは真偽値であるのに対し、こちらは更新したレコード数となって振る舞いが異なる。

もし何かの拍子に新しいインスタンスでupdateをかけてしまったら大事故になるので要注意。

 - Laravel , ,