2015-05-04 17 views
6

Ich habe Converting Multiple Records gelesen. Jetzt versuche ich mehrere Fotos gleichzeitig aus einem Formular zu speichern.CakePHP 3.x: mehrere Datensätze speichern

mit:

debug($this->request->data); 

Ich habe dies:

[ 
    (int) 1 => [ 
     'filename' => '25483_106728809362869_5795827_n.jpg', 
     'description' => '', 
     'album_id' => '2' 
    ], 
    (int) 3 => [ 
     'filename' => '44569_193398817463220_816845208_n.jpg', 
     'description' => '', 
     'album_id' => '1' 
    ] 
] 

Es ist in Ordnung zu sein scheint.

Bake hat sich für mich diese Aktion Methode erstellt:

public function add() { 
     $photo = $this->Photos->newEntity(); 

     if($this->request->is('post')) { 
      $photo = $this->Photos->patchEntity($photo, $this->request->data); 

      if($this->Photos->save($photo)) { 
       return $this->redirect(['action' => 'index']); 
      } 
     } 

     $this->set(compact('photo')); 
    } 

Aber die CakeBook erklärt nicht gut, wie Sie vorgehen. Ich glaube, ich muss newEntities() und patchEntities() verwenden, aber ich verstehe nicht ganz, wie zu tun ist.

Zum Beispiel: warum die newEntity() Methode akzeptiert NULL, während die Methode newEntities() unbedingt ein Argument möchte ?? Die save() Methode akzeptiert nur eine Entität gleichzeitig? Also muss ich das Speichern für jede Entität radieren?

Kann ich ein kleines Beispiel haben? Vielen Dank.

Antwort

8

Angenommen, Ihre Daten im richtigen Format ist, sollte es so einfach, wie dies:

$photos = $this->Photos->newEntities($this->request->data()); 

foreach ($photos as $photo) { 
    $this->Photos->save($photo); 
} 

newEntity() kann eine Null annehmen, weil NewEntity Aufruf ohne Daten eine leere Einheit erstellt, die Sie Daten hinzufügen können, falls Sie die Anfragedaten nicht weitergeben möchten. Zum Beispiel:

$photo = $this->Photos->newEntity(); 
$photo->description = 'Cool!'; 
$photo->filename = 'example.jpg'; 

$this->Photos->save($photo); 

newEntities() erwartet jedoch mehrere Daten oder zumindest eine Reihe von Daten, wenn Sie viele Unternehmen machen wollen.

+0

Dank @Isaac. Aber ich habe eine Sache bemerkt. Wenn ich 'newEntities()' verwende, kann ich das erst tun, nachdem das Formular gesendet wurde (wie du sagst). Normalerweise erstellt Bake mit 'newEntity()' jedoch eine leere Entity, die an die Vorlage übergeben wird und zum Erstellen des Formulars verwendet wird (in diesem Fall: $ this-> Form-> create ($ photo) '). . Wie geht es in diesem Fall? –

+1

Ich glaube auch nicht, dass die 'save()' Methode mehrere Entitäten gleichzeitig speichern kann. In der Tat, einige Tests zu tun, bekomme ich diesen Fehler: 'Fehler: Aufruf einer Mitglied Funktion Fehler() auf Array Datei [...]/Hersteller/cookephp/cockephp/src/ORM/Tabelle.php Linie: 1302 ' –

+0

Es scheint mir, dass die Lösung ist: 1) Erstellen Sie eine leere Entität mit' newEntity() ', die von dem Formular verwendet wird; 2) wenn das Formular gesendet wurde, erstellen Sie die Entität mit 'newEntities()' neu und übergeben '$ this-> request-> data'; 3) jede Entität auf 'save()' ' –

1

Mit saveMany:

In einigen Fällen es sogar besser wäre, saveMany verwendet, die mehr foreach-Schleife nicht brauchen.

$entities = $this->Photos->newEntities($this->request->data()); 
    if($this->Photos->saveMany($entities)) { 
     // saved 
    } else { 
     // error 
    }