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

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

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

в 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 }