Symfony - 更新唯一列验证问题

时间:2010-07-02 13:36:49

标签: php symfony1 symfony-1.4 symfony-forms

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

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

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

我应该使用哪些验证来保留列唯一,但可以随意更改?

5 个答案:

答案 0 :(得分:4)

这可能是一个老问题,但我会在此问题中添加更多详细信息,因为我也遇到了问题并找到了解决方案。

就我而言,Validator没有为isUpdate()方法返回true,这是因为'id'字段未设置。

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

答案 1 :(得分:3)

如果您使用的是Doctrine且验证程序为sfValidatorDoctrineUnique,则它应该按预期工作。

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

你是部分正确,但问题是,如果有人想改变其他领域,虽然独特,保持不变,那么问题仍然存在。除了自己做之外,我认为没有办法阻止这种情况:/

答案 4 :(得分:0)

您应该使用merge代替persist

例如:

$entityManager = $this->getDoctrine()->getManager();
$loadedBrand = $entityManager->merge($loadedBrand);
$entityManager->flush();