Yii2从整数转换为日期时间,以整数显示并保存到数据库中


Yii2 Convert from integer to datetime to display and save into database with integer

我有一个表,列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

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

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();
}

我怎样才能使它正确保存到数据库与整数?

根据您的代码,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);
}

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

我代码:

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