2015-05-04 10 views
6

Ho letto Converting Multiple Records. Ora sto cercando di salvare più foto contemporaneamente da un modulo.CakePHP 3.x: salvataggio di più record

Con:

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

ho questo:

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

Sembra ok.

Bake ha creato per me questo metodo di azione:

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

Ma la CakeBook non spiega bene come procedere. Sento che devo usare newEntities() e patchEntities(), ma non ho capito bene come fare.

Ad esempio: perché il metodo newEntity() può accettare NULL, mentre il metodo newEntities() richiede necessariamente un argomento ?? Il metodo save() accetta solo un'entità alla volta? Quindi, devo salvare il ciclo per ogni entità?

Posso avere un piccolo esempio? Grazie.

risposta

8

Assumendo i dati sono in formato corretto, dovrebbe essere semplice come questo:

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

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

newEntity() può accettare un valore nullo a causa di chiamare newEntity senza dati crea un'entità vuota che è possibile aggiungere dati, nel caso in cui non si voglia passare i dati richiesti. Per esempio:

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

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

newEntities(), tuttavia, si aspetta più dati o almeno una serie di dati se si vuole fare molte entità.

+0

Grazie a @Isaac. Ma ho notato una cosa. Se uso 'newEntities()', posso farlo solo dopo che il modulo è stato inviato (come dici tu). Normalmente, tuttavia, con Bake il 'newEntity()' crea un'entità vuota che viene passata al modello e viene utilizzata per creare il modulo (in questo caso: '$ this-> Form-> create ($ photo)') . Come fare in questo caso? –

+1

Inoltre, non penso che il metodo 'save()' possa salvare più entità contemporaneamente. In effetti, eseguendo alcuni test, ottengo questo errore: 'Errore: chiamata a una funzione membro errors() su array File [...]/vendor/cakephp/cakephp/src/ORM/Table.php Linea: 1302 ' –

+0

Mi sembra che la soluzione sia: 1) creare un'entità vuota con' newEntity() ', che verrà usata dal modulo; 2) quando il modulo è stato inviato, ricrea l'entità usando 'newEntities()' e passando '$ this-> request-> data'; 3) ciclare ogni entità su 'save()' –

1

Utilizzando saveMany:

In alcune occasioni sarebbe ancora meglio utilizzando saveMany che non necessitano più ciclo foreach.

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