我是Symfony Framework的新手,我遇到了表单验证的问题。
我想更新数据库中的数据,包括唯一列,但如果唯一列未更改,则返回错误(具有相同“域”的对象已存在。“)。域列必须是唯一的,但用户应该是因此,如果一个用户保存了他的域名,没有其他人可以使用它,但他将来可以更改它。
表单验证似乎不仅将唯一列与其他行进行比较,而且还将自身与自身进行比较。因此,如果用户不更改列并保存表单,则会返回错误。
我应该使用哪些验证来保留列唯一,但可以随意更改?
答案 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();