Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Symfony 1.4保存前根据数据库条目检查表单值_Database_Validation_Forms_Symfony1_Doctrine - Fatal编程技术网

Database Symfony 1.4保存前根据数据库条目检查表单值

Database Symfony 1.4保存前根据数据库条目检查表单值,database,validation,forms,symfony1,doctrine,Database,Validation,Forms,Symfony1,Doctrine,我正在使用Symfony 1.4和Doctrine。 我有一个表单,它有六个字段:name、parent1、parent2、parent3、parent4、parent5 提交表单后,我想检查数据库中的两件事: 1.名称字段是唯一的 2.parent1、parent2、parent3、parent4和parent5的组合不在数据库中。这些值都是整数(来自相关表的主键),有些字段留空为0。它们将根据用户输入的顺序进入数据库,因此我不关心顺序,但希望在表单保存之前确保组合本身不存在 任何帮助都将不胜

我正在使用Symfony 1.4和Doctrine。 我有一个表单,它有六个字段:name、parent1、parent2、parent3、parent4、parent5 提交表单后,我想检查数据库中的两件事: 1.名称字段是唯一的 2.parent1、parent2、parent3、parent4和parent5的组合不在数据库中。这些值都是整数(来自相关表的主键),有些字段留空为0。它们将根据用户输入的顺序进入数据库,因此我不关心顺序,但希望在表单保存之前确保组合本身不存在


任何帮助都将不胜感激

使用SFValidator回调。在form类中,在setup()函数中添加以下内容:

$this->validatorSchema->setPostValidator(new sfValidatorCallback(array('callback' => array($this, 'YOURCALLBACKFUNCTIONNAME'))));
public function YOURCALLBACKFUNCTIONNAME($validator, $values) {
   //Validate form here
   //Access form items using  $values['FORMNAME'];
   //$error = new sfValidatorError($validator, 'A Error Message.');
   //$es = new sfValidatorErrorSchema($validator, array('FORMITEM' => $error);
   //throw $es;
   }
然后,您可以在同一个文件中创建它,即回调函数:

$this->validatorSchema->setPostValidator(new sfValidatorCallback(array('callback' => array($this, 'YOURCALLBACKFUNCTIONNAME'))));
public function YOURCALLBACKFUNCTIONNAME($validator, $values) {
   //Validate form here
   //Access form items using  $values['FORMNAME'];
   //$error = new sfValidatorError($validator, 'A Error Message.');
   //$es = new sfValidatorErrorSchema($validator, array('FORMITEM' => $error);
   //throw $es;
   }

实际上有一个专门用于此的条令验证器,SFValidator Doctrineuque。在您的表单中,尝试:

public function configure()
{
  parent::configure();
  $this->mergePostValidator(new sfValidatorDoctrineUnique(array(
      'model' => 'MyModelName',
      'column' => array('name')
  )));
  $this->mergePostValidator(new sfValidatorDoctrineUnique(array(
      'model' => 'MyModelName',
      'column' => array('parent1', 'parent2', 'parent3', 'parent4', 'parent5')
  )));
}

我知道你的问题是关于学说的,但是对于那些寻找这个答案并使用Proepl的人来说,有一个推进验证器:

另一个有用的与模型相关的验证器是SFValidatorPropertyUnique验证器,它检查通过表单输入的新值是否与具有唯一索引的数据库列中的现有值冲突。例如,两个用户不能具有相同的登录名,因此在使用表单编辑用户对象时,必须在此列上添加SFValidatorPropertyLunique验证程序:

//推进唯一验证程序$form->setValidator('昵称',新建 SFValidator属性(数组('model'=>'User','column'=> "登入");


哇-我已经做了好几天了!非常感谢Jon,它已经启动并运行了!谢谢Jeremy,这个名字很好用,但是它不会对父列抛出错误,即使我把它放在完全相同的顺序,它也会复制db条目。我建议查看它生成的查询并检查出了什么问题。这几乎肯定不是验证器的问题。