【问题标题】:How can I set a date to NULL in Yii?如何在 Yii 中将日期设置为 NULL?
【发布时间】:2013-01-28 19:03:41
【问题描述】:

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

【问题讨论】:

  • 我不是 Yii 方面的专家,但是查看文档,您可能可以使用这种方法来检查值是否为 null()? yiiframework.com/doc/api/1.1/CValidator#except-detail
  • @dInGd0nG 很有趣,这解释了失败,谢谢。
  • @Jason 谢谢,但据我所知,这仅适用于所谓的场景,即您无法检查传递的实际值,您只能说:Don'在创建新用户或更新用户等时应用此规则。

标签: php mysql validation datetime yii


【解决方案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;
} ...

也应该这样做。

【讨论】:

  • 这条规则正是我所追求的,因为它也适用于手动从前端删除日期。
【解决方案2】:

解决这个问题的简单方法是在创建过程中根本设置值:

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

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

【讨论】:

    【解决方案3】:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-17
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2010-10-05
      • 2012-04-29
      • 2018-08-13
      相关资源
      最近更新 更多