如何在Yii中将日期设置为NULL?

时间:2013-02-13 09:18:29

标签: php mysql validation datetime yii

我有一个日期列,通常将值设为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

3 个答案:

答案 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
}