【Laravel】saveメソッドを用いて複数レコードをインサートしたい【第2回マッヒーの勉強部屋】

こんにちは、新人エンジニアのマッヒーです。
弊社「インスパイアデザイン」では、月に1回勉強会が開催されており、社長のマーチンさん、ベテランエンジニアのトミーさんからのご指導のもと日々勉強させていただいております。

現在私はPHPフレームワークの「Laravel」の学習をしており、躓いたことがあったので本記事に残したいと思いました。私と同じような問題を抱えている方の参考になれば幸いです。

fill、saveメソッドでDBへのインサート

以下のようにモデルのインスタンスを生成して、
fillメソッドに値を渡してsaveメソッドを呼び出すだけで簡単にレコードを1件追加することができます。

$model = new モデル名;
$model->fill( $params )->save();

では複数のレコードを追加したいときはどうすばよいでしょうか。
foreach等のループを使うのが良さそうですね。

躓いたこと

例えば以下のような配列 $items に2件のレコードを追加するための値が格納されていたとして、

$items = [
    [
        'name' => 'taro',
        'age' => 22
    ],
    [
        'name' => 'hanako',
        'age' =>20
    ],
];

私は以下のようにforeach文を書いてみました。

$items = [
    // 省略
];

$model = new モデル名;
foreach ( $items as $item )
{
    $model->fill( $item )->save();
}

しかし、これでデータベースの中身を確認してみると、
「あれ、1件しかデータが追加されていない!?」

原因を調べてみたところ、ループの前で1度インスタンスを生成してから毎回そのインスタンスにsaveメソッドによって上書きされているだけになっているようでした。

つまり、以下のコードのように毎回新しいインスタンを生成する必要があるみたいです。

$items = [
    // 省略
];

foreach ( $items as $item )
{
    $model = new モデル名;
    $model->fill( $item )->save();
}

勉強になりました。。

この記事を書いた人

峯岸真弘