PHP
laravel
laravel5
lumen

【Laravel(Lumen)】saveメソッドを使うとデータが一行しか登録されない原因

後日の禍とならぬようここに書き残しておきます。

TL;DR

saveメソッドを使うときはnewしてから使用すること。
もしくはcreateメソッドを使うこと。

データが一行しか入らない

CSVインポート機能等で一行読み込んでインサート・・・という処理を書くときに恐らく
foreach等を使って行数分、処理を実行させるかと思うのですが、

処理例)

import.php
// CSVから読み込んだ行数分saveを行う
foreach ($csvList as $attributes) {
    $this->fill($attributes)->save();
}

その時にsaveメソッドを使ってるとデータが一行しか入らないという現象に遭遇します。
(具体的にはCSVの場合、最終行のデータしか入っていないようになってるはず)

原因

それもそのはずで、リーダブルに書いてある通り、
saveメソッドを使うときはnewしてから使用しないと同じインスタンスを何回もsaveする、という動きになってしまいます。

Eloquent:利用の開始 5.4 Laravel

モデルから新しいレコードを作成するには新しいインスタンスを作成し、saveメソッドを呼び出します。

なのでsaveメソッドを使うときは必ずnewしてから使用するか、createメソッドを使用するようにしましょう

ということでした。

createメソッドを使用する場合は必ず$fillable$guarded を指定すること!

参考