我有一个日期列,通常将值设为dd.MM.yyyy
。它在模型rules()
中的验证规则是:
array('start, end', 'date', 'format' => 'dd.MM.yyyy'),
我正在从CSV文件填充数据库,如果CSV记录为空,我希望能够将日期设置为NULL
(即无)。所以,我在做:
if (empty($csv_data)) {
$user->start = new CDbExpression('NULL');
} else {
$user->start = $csv_data;
}
但是我收到日期格式无效的错误。那是为什么?
CDateValidator
documentation表示默认情况下allowEmpty
属性为true,因此它应该能够将其设置为NULL
,对吧?请注意,如果我只是将""
字符串分配给日期,则会将其转换为0000-00-00 00:00:00
时间戳,而不是NULL
。
答案 0 :(得分:25)
rules()
中的:
array('start, end', 'date', 'format' => 'dd.MM.yyyy'),
array('start, end', 'default', 'setOnEmpty' => true, 'value' => null),
另外,
if (empty($csv_data)) {
$user->start = null;
} ...
也应该这样做。
答案 1 :(得分:3)
对此的简单修复不是在创建过程中设置的所有:
if (!empty($csv_data)) {
$user->start = $csv_data;
}
这样,日期将不会被设置,因此显示为空,这也会通过验证。
答案 2 :(得分:2)
为字段分配CDbExpression
将(并且应该)永远不会通过验证;验证器允许null
但它肯定不允许任意CDbExpression
作为字段的值;这不应该是令人惊讶的。
如果您想将null
写入数据库,只需使用$user->start = null
即可完成 - 没有理由在此处涉及CDbExpression
。
如果你 需要使用CDbExpression
,你可以使用的另一种方法是告诉save
不要验证记录并手动执行,如: / p>
$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
}