Как установить дату в NULL в Yii? - программирование
Подтвердить что ты не робот

Как установить дату в NULL в Yii?

У меня есть столбец даты, который обычно принимает значения как dd.MM.yyyy. Правило его проверки в модели rules() таково:

array('start, end', 'date', 'format' => 'dd.MM.yyyy'),

Я заполняю базу данных из файла CSV, и мне бы хотелось установить дату на NULL (т.е. ничего), если CSV-запись пуста. Итак, я делаю:

if (empty($csv_data)) {
  $user->start = new CDbExpression('NULL');
} else {
  $user->start = $csv_data;
}

Но я получаю сообщение об ошибке, когда формат даты недействителен. Почему это?

Документация CDateValidator говорит, что свойство allowEmpty по умолчанию истинно, поэтому оно должно быть способным установить значение NULL, правильно? Обратите внимание, что если я просто укажу строку "" на дату, она преобразует ее в временную метку 0000-00-00 00:00:00, которая не является NULL.

4b9b3361

Ответ 1

в модели rules():

array('start, end', 'date', 'format' => 'dd.MM.yyyy'),
array('start, end', 'default', 'setOnEmpty' => true, 'value' => null),

также,

if (empty($csv_data)) {
  $user->start = null;
} ...

тоже должен сделать трюк.

Ответ 2

Тривиальное исправление для этого - не устанавливать значение вообще во время создания:

if (!empty($csv_data)) {
  $user->start = $csv_data;
}

Таким образом, дата не будет установлена ​​и, таким образом, будет казаться пустой, что также пройдет проверку.

Ответ 3

Назначение a CDbExpression в поле будет (и должно) никогда не проходить проверку; валидатор допускает null, но он определенно не может допускать произвольное CDbExpression как значение поля; это не должно удивлять.

Если вы хотите записать null в базу данных, просто сделайте это с помощью $user->start = null - здесь нет причин включать CDbExpression.

Другой подход, который вы могли бы использовать в случае, если вам нужно было использовать CDbExpression, было бы сказать save не проверять запись и сделайте это вручную, как в:

$attributes = $user->attributeNames();
if (empty($csv_data)) {
    $user->start = new CDbExpression('NULL');
    $attributes = array_diff($attributes, array('start')); // don't validate this
} else {
    $user->start = $csv_data;
}

if ($user->validate($attributes)) { // validate only attributes we want here
    $user->save(false); // no validation at all here
}