【问题标题】:Yii2 Convert from integer to datetime to display and save into database with integerYii2 从整数转换为日期时间以显示并以整数保存到数据库中
【发布时间】:2015-10-13 07:47:50
【问题描述】:

我有一个表,其中列for_date 按整数类型保存在数据库中。 为了以 DateTime 格式显示for_date,我使用了带有代码的 ActiveForm:

<?= $form->field($model, 'for_date')->textInput([
    'class' => 'form-control datepicker',
    'value' => $model->for_date ? date(Yii::$app->params['dateFormat'], $model->for_date) : date(Yii::$app->params['dateFormat'], time()),
    'placeholder' => 'Time'])
    ->label('Attendance Date') ?>

但是当我创建和保存时,Yii 通知了This field must be integer

在模型文件中,我在验证之前有以下两个函数需要转换,但它仍然是错误的。

public function beforeValidate(){
    if(!is_int($this->for_date)){
        $this->for_date = strtotime($this->for_date);
        $this->for_date = date('d/M/Y', $this->for_date);
    }
    return parent::beforeValidate();
}

public function afterFind(){
    $this->for_date = \Yii::t('app', Yii::$app->formatter->asDate($this->for_date));
    $this->for_date = date('d/M/Y', $this->for_date);
    return parent::afterFind();
}

我怎样才能正确地将整数保存到数据库中?

【问题讨论】:

  • 我会将其保留为模型中的int 并使用getter 和setter。您收到的错误消息很可能来自您的规则设置。所以你可以在那里改变你的验证器。

标签: php datetime yii2 yii2-validation


【解决方案1】:

根据您的代码,for_datebeforeValidate 运行后仍为日期格式,原因如下:

$this->for_date = date('d/M/Y', $this->for_date);

删除此行,它应该可以工作。

但是,您仍然会遇到问题,例如日期格式或有人输入无效日期,例如 30/02/2015

我建议创建一个单独的属性,例如for_date_display 并为此添加日期规则。然后在beforeSave 中将此日期转换为时间戳并将for_date 设置为该值,如下所示:

public $for_date_display;
...

public function afterFind() {
    $this->for_date_display = \Yii::t('app', Yii::$app->formatter->asDate($this->for_date))
}

public function beforeSave($insert = true) {
    $this->for_date = strtotime($this->for_date_display);
    return parent::beforeSave($insert);
}

【讨论】:

  • 为什么要有一个函数 beforeSave?
  • 因为for_date不会被用户直接输入/编辑。他们编辑for_date_display,需要对其进行转换以保存在数据库中。
【解决方案2】:

我找到了解决方案。在模型搜索中(我的例子是AttendanceSearch.php),找到规则函数并将for_dateinteger行移动到safe下面的行

我的代码:

public function rules()
    {
        return [
            [['id', 'user_id', 'project_id', 'commit_time', 'workload_type'], 'integer'],
            [['comment', 'for_date'], 'safe'],
        ];
    }

【讨论】:

    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    相关资源
    最近更新 更多