Doctrine PHP 1.2 - 如何跳过空字段的唯一验证

时间:2011-11-28 10:53:32

标签: validation doctrine-1.2

我有一个具有独特领域的模型,如下图所示。问题是该字段是可选的,当它为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;
    }
}

2 个答案:

答案 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提供的解决方案。