2015-05-04 82 views
6

我讀過Converting Multiple Records。現在我試圖從表單中一次保存多張照片。CakePHP 3.x:保存多個記錄

有了:

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

我有這樣的:

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

它似乎確定。

烘烤爲我創造了這個動作方法:

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

但CakeBook不能很好地解釋如何進行。我覺得我必須使用newEntities()patchEntities(),但我不太明白該怎麼做。

例如:爲什麼newEntity()方法可以接受NULL,而方法newEntities()必然需要參數? save()方法一次只接受一個實體?那麼,我必須爲每個實體循環儲蓄?

我可以舉個小例子嗎?謝謝。

回答

8

假設你的數據是正確的格式,它應該是這樣簡單:因爲調用newEntity沒有數據創建一個空白的實體,您可以將數據添加到

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

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

newEntity()可以接受空,如果你不想傳入請求數據。例如:

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

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

newEntities(),但是,如果你想使許多實體預計多個數據或至少一組數據。

+0

謝謝@Isaac。但我注意到一件事。如果我使用'newEntities()',我只能在表單被髮送後才能做到(如你所說)。然而,通常情況下,通過烘焙'newEntity()'創建一個傳遞給模板並用於創建表單的空白實體(在這種情況下:'$ this-> Form-> create($ photo)'') 。在這種情況下怎麼辦? –

+1

另外,我不認爲'save()'方法可以一次保存多個實體。事實上,我做了一些測試,發現這個錯誤: '錯誤:調用成員函數錯誤()array File [...]/vendor/cakephp/cakephp/src/ORM/Table.php Line: 1302' –

+0

在我看來,解決方案是:1)用'newEntity()'創建一個空實體,它將被表單使用; 2)當表單被髮送時,使用'newEntities()'並傳遞'$ this-> request-> data'來重新創建實體; 3)將每個實體循環到'save()' –

1

使用saveMany:

在某些情況下這將是更好的使用saveMany它不需要foreach循環了。

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