16

我有一个日期列,通常将值作为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文档说该属性allowEmpty默认为 true,因此它应该能够将其设置为NULL,对吗?请注意,如果我只是将""字符串赋值给日期,它会将其转换为0000-00-00 00:00:00时间戳,而不是NULL.

4

3 回答 3

26

在模型中rules()

array('start, end', 'date', 'format' => 'dd.MM.yyyy'),
array('start, end', 'default', 'setOnEmpty' => true, 'value' => null),

还,

if (empty($csv_data)) {
  $user->start = null;
} ...

也应该这样做。

于 2013-02-13T11:08:11.023 回答
3

对此的微不足道的解决方法是在创建过程中根本不设置值:

if (!empty($csv_data)) {
  $user->start = $csv_data;
}

这样,日期将不会被设置,因此显示为空,这也通过了验证。

于 2013-02-13T09:28:20.257 回答
2

将 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
}
于 2013-02-13T09:52:53.547 回答