У меня есть столбец даты, который обычно принимает значения как dd.MM.yyyy
. Правило его проверки в rules()
модели 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
.
в rules()
модели rules()
:
array('start, end', 'date', 'format' => 'dd.MM.yyyy'), array('start, end', 'default', 'setOnEmpty' => true, 'value' => null),
также,
if (empty($csv_data)) { $user->start = null; } ...
должен делать трюк тоже.
Тривиальное исправление для этого – не устанавливать значение вообще во время создания:
if (!empty($csv_data)) { $user->start = $csv_data; }
Таким образом, дата не будет установлена и, таким образом, будет казаться пустой, что также пройдет проверку.
Присвоение 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 }