2016-04-05 7 views
3

Ich muss genau drei Seiten gleichzeitig über Formular speichern. Ich möchte in ähnlicher Weise speichern wie Modell speichern() -Methode, denn dies wird automatisch aktualisieren Zeitstempel.Laravel 5.2 mehrere Modell speichern()

Wie wird dies für mehrere Datensätze gleichzeitig getan?

Meine Seite Modell:

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

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

Mein Code:

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(); 
} 

Hinweis: Ich bin stark gegen mehrere Instanzen Seite Modells, und dann Schleife sie um sie einzeln zu retten. Außerdem möchte ich DB-Einfügung nicht verwenden, weil es Rekordzeitstempel nicht automatisch aktualisiert.

Antwort

1

Nach langer langer Suche sieht aus wie ich dies gefunden:

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

Ja, es ist Iteration, sieht aber wie es keine anderen Methoden, wie mehrere Modelle zu speichern. Die einzige Alternative ist die Verwendung von DB::insert(), aber beachten Sie, dass die Zeitstempel nicht automatisch aktualisiert werden.

Wenn Sie bereit sind, zu viele redegewandte Modelle zu speichern, speichern Sie sie wegen möglicher Speicherprobleme (oder schieben Sie sie in Queue).

2

Wenn Sie das Handbuch lesen Mass Assignment.

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(); 
} 
+0

Vielen Dank für Antwort hinzuzufügen. Ich habe bereits offizielle Dokumente gelesen, aber das hat mir keine Hilfe gebracht. Page :: create ($ data) erzeugt eine Exception (preg_match() erwartet, dass Parameter 2 ein String ist, ein Array ist gegeben); Ich habe auch versucht, Page :: create ([... first ....], [... second ....], [... third ....]), aber es fügt nur einen leeren Datensatz ein Datenbank, was ich nicht erreichen möchte. – Fusion

+0

Aber wenn Ihre Spalten nicht in 'protected $ fillable = []' aufgeführt sind, funktioniert es nicht. Wenn Sie '$ fillable' gesetzt haben und Ihre Arrays gesetzt sind, müssen Sie sicherstellen, dass Ihre Werte tatsächlich Strings und keine Arrays sind. d. h. $ request-> first' und '$ request-> firstCont' – ash

+0

Ich habe die Model Unguard() und Reguard() -Modellmethoden verwendet. Daher sollte das bewachte/befüllbare hier kein Problem sein (oder ist es das? - Wenn es ein Problem wäre, würde Laravel eine Massenzuordnungsausnahme auslösen). Ich bin mir 100% sicher, über den Inhalt meiner Anfragen. Ich habe vor kurzem mit dd() überprüft. Alle sind Saiten. – Fusion

0

Hier ist die beste Lösung, die ich

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

mit vermeiden die Notwendigkeit, führt so viele Abfragen implementieren gefunden, wie Sie Einträge haben

Allow Eloquent to save multiple records at once