Doctrine PHP 1.2 - Как пропустить уникальную проверку пустого поля - PullRequest
2 голосов
/ 28 ноября 2011

У меня есть модель с уникальным полем, как показано ниже. Проблема в том, что поле является необязательным, и когда оно пустое, я получаю уникальное сообщение об ошибке доктрины.

Я ожидал, что он только подтвердит уникальность полей 'notnull' => true.

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

Заранее спасибо.

Редактировать: я отключил проверку, и похоже, что поле содержит пустую строку вместо нуля:

SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись '' для ключа 'filename'

Таким образом, теперь возникает вопрос: как применить нулевые значения к пустым значениям ...

Редактировать 2: я сделал это как обходной путь. = /

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

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Лучше было бы расширить форму и переопределить валидатор поста с помощью собственного метода:

Вы должны поместить это в 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 голосов
/ 11 апреля 2014
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.

...