web-dev-qa-db-ja.com

Laravel 5.2複数モデルsave()

フォームを介して一度に3ページを保存する必要があります正確に。モデルのsave()メソッドと同様の方法で保存したいのですが、これによりレコードのタイムスタンプが自動的に更新されます。

一度に複数のレコードに対してこれを行う方法は?

マイページモデル

namespace App;
use Illuminate\Database\Eloquent\Model;

class Page extends Model{
     protected $table = 'simple_pages';
}

私のコード

public function createPages(Request $request){ // I use Page at the top
     $data = [
          [
          'title'=> $request->first,
          'content'=> $request->firstCont
          ],[
          'title'=> $request->second,
          'content'=> $request->secondCont
          ][
          'title'=> $request->third,
          'content'=> $request->thirdCont
          ]
     ];
     Page::unguard();
     $pages = new Page($data);
     $pages->save(); // Something like this would be amazing
     Page::reguard();
}

:私は強くページモデルの複数のインスタンスを作成することに反対しており、それらをループして個別に保存します。また、DB挿入はレコードのタイムスタンプを自動的に更新しないため、使用したくありません。

6
Fusion

長い間検索した後、私はこれを見つけたように見えます:

_        $eloquentCollection->each(function ($item, $key) {
            $item->save();
        });
_

はい、それは反復ですが、複数のモデルを保存する方法は他にないようです。唯一の代替手段はDB::insert()を使用することですが、タイムスタンプが自動的に更新されないことに注意してください。

また、保存する雄弁なモデルが多すぎる場合は、メモリの問題が発生する可能性があるため、チャンクごとに保存します(または、モデルをQueueにプッシュします)。

4
Fusion

マニュアルを読んだ場合 一括割当

public function createPages(Request $request){ // I use Page at the top
     $data = [
          [
          'title'=> $request->first,
          'content'=> $request->firstCont
          ],[
          'title'=> $request->second,
          'content'=> $request->secondCont
          ][
          'title'=> $request->third,
          'content'=> $request->thirdCont
          ]
     ];

     Page::unguard();
     $pages = Page::create($data);
     Page::reguard();
}
2
ash

これが私が実装するために見つけた最良の解決策です

User::create([array of multiple user detail arrays])

追加するエントリと同じ数のクエリを実行する必要がないようにします

Eloquentが一度に複数のレコードを保存できるようにする

1
Mahmoud Nassar