我是 Symfony 框架的新手,遇到了表单验证问题。
我想更新数据库中的数据,包括唯一列,但如果唯一列未更改,则会返回错误(已存在具有相同“域”的对象。”)。域列必须是唯一的,但用户应该能够更改所以,如果一个用户保存了他的域名,其他人就不能使用它,但他可以在将来更改它。
似乎表单验证不仅将唯一列与其他行进行比较,而且还将其与自身进行比较。因此,如果用户不更改列并保存表单,则会返回错误。
我应该使用什么验证来保持列的唯一性,但可以自由更改?
我是 Symfony 框架的新手,遇到了表单验证问题。
我想更新数据库中的数据,包括唯一列,但如果唯一列未更改,则会返回错误(已存在具有相同“域”的对象。”)。域列必须是唯一的,但用户应该能够更改所以,如果一个用户保存了他的域名,其他人就不能使用它,但他可以在将来更改它。
似乎表单验证不仅将唯一列与其他行进行比较,而且还将其与自身进行比较。因此,如果用户不更改列并保存表单,则会返回错误。
我应该使用什么验证来保持列的唯一性,但可以自由更改?
这可能是一个老问题,但我将添加有关此错误原因的更多详细信息,因为我也遇到了问题并找到了解决方案。
就我而言,验证器没有为 isUpdate() 方法返回 true,这是因为未设置“id”字段。
为避免此问题,请从未设置的字段中删除“id”并将其更改为 sfWidgetFormInputHidden。
如果您使用 Doctrine 并且验证器是sfValidatorDoctrineUnique,它应该可以按预期工作。
即验证您是否正在更新对象。见第 102 行。
要制作 isUpdate() 你必须使用 $this->form->setPostValidator();
$this->validatorSchema->setPostValidator( new sfValidatorDoctrineUnique(array('model' => 'Model', 'column' => 'column_name')) );
你说对了一部分,但问题是,如果有人想改变其他领域,虽然是独一无二的,但保持不变,那么问题仍然存在。除了自己做之外,我看不出有任何方法可以防止这种情况发生:/
你应该使用merge
而不是persist
例如:
$entityManager = $this->getDoctrine()->getManager();
$loadedBrand = $entityManager->merge($loadedBrand);
$entityManager->flush();