2

我是 Symfony 框架的新手,遇到了表单验证问题。

我想更新数据库中的数据,包括唯一列,但如果唯一列未更改,则会返回错误(已存在具有相同“域”的对象。”)。域列必须是唯一的,但用户应该能够更改所以,如果一个用户保存了他的域名,其他人就不能使用它,但他可以在将来更改它。

似乎表单验证不仅将唯一列与其他行进行比较,而且还将其与自身进行比较。因此,如果用户不更改列并保存表单,则会返回错误。

我应该使用什么验证来保持列的唯一性,但可以自由更改?

4

5 回答 5

4

这可能是一个老问题,但我将添加有关此错误原因的更多详细信息,因为我也遇到了问题并找到了解决方案。

就我而言,验证器没有为 isUpdate() 方法返回 true,这是因为未设置“id”字段。

为避免此问题,请从未设置的字段中删除“id”并将其更改为 sfWidgetFormInputHidden。

于 2011-08-31T14:48:56.677 回答
3

如果您使用 Doctrine 并且验证器是sfValidatorDoctrineUnique,它应该可以按预期工作。

即验证您是否正在更新对象。见第 102 行。

于 2010-07-02T14:37:30.673 回答
2

要制作 isUpdate() 你必须使用 $this->form->setPostValidator();

$this->validatorSchema->setPostValidator( new sfValidatorDoctrineUnique(array('model' => 'Model', 'column' => 'column_name')) );

于 2013-04-02T11:19:27.437 回答
1

你说对了一部分,但问题是,如果有人想改变其他领域,虽然是独一无二的,但保持不变,那么问题仍然存在。除了自己做之外,我看不出有任何方法可以防止这种情况发生:/

于 2011-03-22T08:23:14.860 回答
0

你应该使用merge而不是persist

例如:

$entityManager = $this->getDoctrine()->getManager();
$loadedBrand = $entityManager->merge($loadedBrand);
$entityManager->flush();
于 2015-05-11T07:31:04.913 回答