CakePHP 表单验证使用其他模型来验证和/或保存?

Posted

技术标签:

【中文标题】CakePHP 表单验证使用其他模型来验证和/或保存?【英文标题】:CakePHP Form validation using other models to validate and/or save? 【发布时间】:2013-11-15 21:21:37 【问题描述】:

所以我的问题很像标题。我有一个名为 StudentApplicationForm 的表单对象。这使用了一些名为grade_element_form.ctp、schools_element_form.ctp、student_element_form.ctp 和guardian_element_form.ctp 的元素。提交表单时,它们都有各自的输入并发送到我的 StudentApplicationForm 模型。我想使用 Grade、School、Student 和 Guardian 对象来验证数据,然后再将它们各自的信息保存在数据库中各自的表中。

我能够构建适当的数组以发送到表单的每个对象的模型并将它们保存到数据库中。现在我想确保它们在保存之前得到验证。是使用以下方法解决此问题的最佳方法:

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

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

如图所示:cakephp form validation

【问题讨论】:

不,我问我是否应该这样验证。并不是说我有错误。因为阅读数据验证(validation() 和 set() 函数)似乎是我想要的。然后在验证表单的所有部分后,保存到数据库中,对吗?我只是想确保我朝着这种方法的正确方向前进。 【参考方案1】:

如果模型是相关的,您可以使用 $this->Model->saveAll() 或 $this->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();

【讨论】:

它们都是相关的。一个学生可能有很多学校,一个学校可能有很多年级,一个学生可能有很多监护人。我在看协会吗? book.cakephp.org/2.0/en/models/… 如果没有,那么交易可能会起作用。 在这种情况下,是的,您应该能够使用 saveAssociated 将它们一起保存。但是,您必须使用设置 'deep' => true。 问题是在提交表单之前,我需要创建一个与学生、监护人和学校(以及学校的成绩表)相关的代码,并将该信息添加到要保存的表单数据中.该代码是所有 4 个的外键。所以有没有办法将它插入到提交表单中。我只想创建它,如果它们经过验证可以保存,然后将代码与所有相关模型一起保存。 我不确定我是否明白你在问什么。您可以尝试使用隐藏的表单字段,但通常不建议通过表单传递外键,因此最好通过检查数据库来确定要使用哪些外键。 所以我说的是创建外键并将其与学生或监护人等其他数据一起保存。

以上是关于CakePHP 表单验证使用其他模型来验证和/或保存?的主要内容,如果未能解决你的问题,请参考以下文章

cakephp 表单验证成功类/消息

cakephp 一个表单,多个模型,不显示一个模型的验证消息

CakePHP 模型验证无法正常工作

Cakephp SaveAssociated 和 Save - 使用相同的模型验证代码

CakePHP 不检查表单验证

CakePHP Validation 没有二维数组的模型