Yii2 Преобразование из целого числа в дату и время для отображения и сохранения в базе данных с целым числом

У меня есть таблица с колонкой for_date сохраняются по типу integer в базе данных. Для того, чтобы показать for_date с форматом DateTime я использовал 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();
}

Как я могу сделать это правильно, чтобы сохранить в базе данных с целым числом?

2 ответа

Решение

Я нашел решение. В поиске модели (мой случай AttendanceSearch.php), найдите правила и двигайтесь for_date от линии есть integer ниже строки имеют safe

Мой код:

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

По вашему коду for_date все еще в формате даты после beforeValidate работает из-за линии:

$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);
}
Другие вопросы по тегам