У меня есть столбец даты, который обычно принимает значения как 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 }