【问题标题】:Doctrine PHP 1.2 - How to skip unique validation of null fieldDoctrine PHP 1.2 - 如何跳过空字段的唯一验证
【发布时间】:2011-11-28 10:53:32
【问题描述】:

我有一个具有独特字段的模型,如下所示。问题是该字段是可选的,当它为空时,我会收到教义的唯一错误消息。

我希望它仅用于验证 'notnull' => 真实字段的唯一性。

$this->hasColumn('filename', 'string', 40, array(
     'type' => 'string',
     'unique' => true,
     'length' => '40',
 ));

提前谢谢你。

编辑:我禁用了验证,看起来该字段带有一个空白字符串而不是 null:

SQLSTATE[23000]: 完整性约束违规: 1062 Duplicate entry '' for key 'filename'

所以现在的问题是:如何对空白值强制执行空值...

编辑 2:我这样做是为了解决问题。 =/

public function preValidate()
{
    if(!$this->filename) {
        $this->filename = null;
    }
}

【问题讨论】:

    标签: validation doctrine-1.2


    【解决方案1】:

    扩展表单并使用您自己的自定义方法覆盖帖子验证器可能是一个更好的主意:

    你可以把它放在 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);
      }
    }
    

    如果你构建了一个验证器,如果你再次遇到这种情况,它是可以重新使用的。

    【讨论】:

    • 顺便说一下,我假设您使用的是 symfony 1.4。如果不是,这个过程仍然非常相似。
    • 很好的解决方案。但是为了工作,我替换了 $column = $this->getOption('column'); for $column = current($this->getOption('column'));因为 getColumn 返回一个数组。
    【解决方案2】:
    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 提供的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      相关资源
      最近更新 更多