我有一个具有独特领域的模型,如下图所示。问题是该字段是可选的,当它为null时,我得到了doctrine的唯一错误消息。
我期待它只是为了验证'notnull'=>的唯一性真实的领域。
$this->hasColumn('filename', 'string', 40, array(
'type' => 'string',
'unique' => true,
'length' => '40',
));
提前谢谢。
编辑:我禁用了验证,看起来该字段带有空字符串而不是null:
SQLSTATE [23000]:完整性约束违规:1062密钥'filename'重复输入''
所以现在的问题是:如何对空白值强制执行空值...
编辑2:我做了解决方法。 = /
public function preValidate()
{
if(!$this->filename) {
$this->filename = null;
}
}
答案 0 :(得分:3)
扩展表单可能是一个更好的主意,并使用您自己的自定义方法覆盖post验证程序:
您可以将其放入FileForm(或调用您的表单名称):
$this->validatorSchema->setPostValidator(
new myValidatorDoctrineUniqueWithNull(array('model' => 'File', 'column' => array('filename')))
);
然后你会创建自己的验证器(如上所定义),如下所示:
class myValidatorDoctrineUniqueWithNull extends sfValidatorDoctrineUnique
{
protected function doClean($values)
{
// if the user passes an empty value, assume it must be null in the database
// which is an allowed "non-unique" value.
$column = $this->getOption('column');
if (!$values[$column])
{
return $values;
}
return parent::doClean($values);
}
}
如果你构建了一个验证器,那么如果再遇到这种情况,它就可以恢复。
答案 1 :(得分:0)
class myValidatorDoctrineUniqueWithNull extends sfValidatorDoctrineUnique
{
protected function doClean($values)
{
// if the user passes an empty value, assume it must be null in the database
// which is an allowed "non-unique" value.
$column = current($this->getOption('column'));
if (!$values[$column])
{
// Solves the problem of the unique index in mysql, because doctrine uses a empty string
if(empty($values[$column]))
$values[$column] = null;
return $values;
}
return parent::doClean($values);
}
}
除了Slickrick12提供的解决方案。