2011-11-28 80 views
2

我有一個獨特的字段模型,如下圖所示。問題是這個字段是可選的,當它爲空時,我得到了教條的唯一錯誤信息。Doctrine PHP 1.2 - 如何跳過空字段的唯一驗證

我期待它只驗證'notnull'=> true字段的唯一性。

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

在此先感謝您。

編輯:我禁用驗證,它看起來像外地攜帶一個空字符串,而不是空的:

SQLSTATE [23000]:完整性約束衝突:「關鍵「文件名」

1062重複條目」

所以現在的問題是:如何在空白值上強制使用空值...

編輯2:我是這樣做的解決方法。 =/

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

回答

3

這可能是一個更好的主意來擴展形式,並用自己的自定義方法重寫後驗證:

你會把這在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); 
    } 
} 

如果你構建一個驗證器,如果你再次遇到這種情況,它是可以接受的。

+0

我假設你正在使用symfony 1.4。否則,這個過程仍然非常相似。 – Slickrick12

+0

偉大的解決方案。但是爲了工作,我換成了$ column = $ this-> getOption('column'); $ column = current($ this-> getOption('column')); beacuse getColumn返回一個數組。 –

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