2013-11-15 130 views
0

所以我的問題很像標題。我有一個名爲StudentApplicationForm的表單對象。這使用一些稱爲grade_element_form.ctp,schools_element_form.ctp,student_element_form.ctp和guardian_element_form.ctp的元素。當表單提交時,所有內置的輸入都被構建併發送到我的StudentApplicationForm模型。我希望使用成績,學校,學生和監護對象來驗證數據,然後將它們各自的信息保存在數據庫各自的表中。CakePHP使用其他模型驗證和/或保存表單驗證?

我能夠建立適當的數組發送到窗體的每個對象的模型,並將它們保存到數據庫。現在我想確保它們在保存之前進行驗證。通過使用接近這一目標的最佳方式:

$this->ModelName->set($the_data) 

if($this-ModelName->validate()){ 
//true 
}else{ 
//false 
} 

如下所示:cakephp form validation

+0

不,我問我應該驗證這樣的。不是我有錯誤。因爲閱讀數據驗證(validation()和set()函數)看起來就像我想要的。然後,在表單驗證完成後,保存到數據庫中,對不對?我只是想確保我正朝着這個方法的正確方向前進。 – pmac89

回答

1

如果模型是相關的,你可以使用這個 - $>型號 - >白水()或$這個 - > Model-> saveAssociated()通過將所有數據放在一個數組中並進行正確格式化並保存,一次性保存它們。

如果它們不相關,那麼您需要使用事務http://book.cakephp.org/2.0/en/models/transactions.html。對於事務,在保存之前不需要調用$ this-> ModelName-> validate()。啓動事務,嘗試保存每個事務,如果其中一個失敗,則回滾以及您在啓動事務後嘗試的所有更改都不會在數據庫中。如果一切順利,就提交。

例子:

$dataSource = $this->Model1->getDataSource(); 
$dataSource->begin(); 

if(!$this->Model1->save($array1)) 
{ 
     $dataSource->rollback(); 
     $this->Session->setFlash('There was an error saving model 1'); 
     return; 
} 

//Continue the pattern for the other models... 

//If all the saves succeeded then... 
$dataSource->commit(); 
+0

他們都有關係。一個學生可能有很多學校,一所學校可能有很多成績,一個學生可能有很多監護人。我在看協會嗎? http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html如果不是,那麼交易可能會奏效。 – pmac89

+0

在這種情況下,是的,您應該可以使用saveAssociated將它們保存在一起。但是,您必須使用設置'deep'=> true。 – Kai

+0

在提交表格前,我需要創建一個與學生,監護人和學校(以及學校成績表)相關的代碼,並將該信息添加到要保存的表單數據中。該代碼是所有4的外鍵。那麼是否有方法將其插入到提交表單中。我只想創建它,如果它們經過驗證保存,然後將代碼與所有關聯的模型一起保存。 – pmac89