使用ZF2保存到多个表时检查空值

时间:2016-02-25 20:06:25

标签: php mysql database oop zend-framework2

我正在使用ZF2和mysql,但问题是与平台无关。我有一个数据传输对象Organization从html表单中获取水分。 OrganizationMapper有一个save方法,(1)将Organization作为参数,(2)一个接一个地填充几个数据库表。

假设第一个表填充正常,但第二个表没有填充,因为Organization的某个属性未设置(对列没有空约束)。用户收到错误,但第一个表已经填满。如果他再次尝试提交表单,但是这次填写了所有的html字段,所有表格都填好了,但是第一个表格有一个以前未用过的行。

我怎么能避免这种情况?

我想在mapper的empty方法中使用if检查save值,但它看起来并不优雅。我知道ZF2中的InputFilter验证,但是这些验证表单中的用户输入,当php代码与数据库通信时,它们不会检查。

任何帮助?

1 个答案:

答案 0 :(得分:1)

最好的方法是在开始将数据写入数据库之前验证所有数据。

我没有使用ZF2,这个解决方案实际上是依赖于框架的,因此您需要检查ZF2文档。例如,在Yii中,您只需为模型的每个字段定义验证规则,因此您可以确保在开始将数据保存到数据库之前Organization包含所有数据,可能Zend中可能存在类似的情况。

请注意,验证并不仅仅意味着检查空值,您可能需要验证不同的内容,例如:"电子邮件是正确的电子邮件,如xxx@yyy.com",&# 34;名称不为空","名称长度超过3个字符","名称长度小于1000个字符"等等。

对于Yii,它大致如下:

class Organization extends ActiveRecord {
   ...
   // here we define the validation rules
   public function rules() {
       return [
          // name is required
          ['name', 'required'], 
          // check min / max length
          ['name', 'string', 'min' => 3, 'max' => 12],
          // check if email is valid
          ['email', 'email']
       ];
   }
}

现在您可以执行$organization->validate()以确保一切正确(同样,当您$organization->save()时,将会在保存到数据库之前检查规则。

另一个防止数据不一致的解决方案是使用事务。在您写入多个表的情况下,即使您验证了所有内容,也无论如何都需要它们。意外的事情发生了,所以最好保护你的保存代码(伪代码):

 $transaction->start();
 try {
     $table1->writeSomeData();
     $table2->writeMoreData();
     $transaction->commit();
 } (catch Exception $e) {
     $transaction->rollback();
 }

再次,检查您的框架文档,它可能以某种方式支持它。