【Laravel8】foreachでレコードを複数保存したいのに1レコードしか保存されない。

今回もなんかうまいこといかなかったのでネタにしてみました~

概要

ほい、今回はLaravelを使っている時に配列で保存しているデータを保存したかったんです。

しかも配列の為複数レコードを保存することになるのでforeachを利用することにしました。

しかし!レコードがうまく保存されなかったのでそれを解決しちゃおう!ってことですね。

解決したい課題: foreachで複数レコードを保存したい。

今回やりたいことは配列に入ったデータを保存したい。

レコードは複数になるので、配列をforeachで回して配列に入っている分だけ保存する!というやつですね。

userテーブル

idname
1牛島
2高橋

このテーブルにレコードを追加していきたい!

それが以下のコードで対応してみようとした。

use App\Models\User;

public function index()
{
    $names = ["山田", "鈴木", "田中"];

    //インスタンスを作成
    $user = new User();

    //名前をほぞん
    foreach ($names as $name){
        $user->name = $name;
        $user->save();
    }
}Code language: PHP (php)

userテーブルがあるとして、そこにレコードを追加していくイメージ!

しかし。。。

idname
1牛島
2高橋
3田中

なんか1つのレコードしか追加されてないんやが。。。。

ということで解決させてみましょう!

課題の原因: save()メソッドが…

今回の原因はsave()メソッドに合ったっぽいですね。

挿入
もちろん、Eloquentを使用する状況は、データベースからモデルを取得する必要がある場合だけに限りません。新しいレコードを挿入する必要もあるでしょう。うれしいことに、Eloquentはこれをシンプルにします。データベースへ新しいレコードを挿入するには、新しいモデルインスタンスをインスタンス化し、モデルに属性をセットする必要があります。次に、モデルインスタンスでsaveメソッドを呼び出します。

https://readouble.com/laravel/8.x/ja/eloquent.html

うん、新しくレコードを追加するにはインスタンス化をいちいちしないといけないっぽいですね。

毎回インスタンス化させるといけるっぽいです。

解決方法: foreachの中でインスタンス化!

では毎度インスタンス化するようなコードを書いていきましょう!

use App\Models\User;

public function index()
{
    $names = ["山田", "鈴木", "田中"];

    //名前をほぞん
    foreach ($names as $name){
        //インスタンスを作成
        $user = new User();
        $user->name = $name;
        $user->save();
    }
}Code language: PHP (php)

ほい!これでOKっぽい。

まあ、foreachの中でインスタンス化させただけですけどね。www

idname
1牛島
2高橋
3山田
4鈴木
5田中

これで解決だー

まとめ

クリスマスにも技術ブログを更新できたことを光栄に思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA