Ответ 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;
} ...
тоже должен сделать трюк.
У меня есть столбец даты, который обычно принимает значения как 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;
}
Но я получаю сообщение об ошибке, когда формат даты недействителен. Почему это?
в модели 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;
}
Таким образом, дата не будет установлена и, таким образом, будет казаться пустой, что также пройдет проверку.
Назначение 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
}