2015-10-13 21 views
5

Mam tabelę z kolumną for_date zapisaną przez typ integer w bazie danych. W celu wykazania for_date z formatem DateTime, użyłem ActiveForm z kodem:Yii2 Konwertuj z liczby całkowitej na datetime, aby wyświetlić i zapisać w bazie danych z liczbą całkowitą

<?= $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') ?> 

Ale kiedy tworzyć i zapisywać, Yii poinformował This field must be integer

W pliku modelu, miałem 2 funkcje poniżej przekonwertować przed validate , ale nadal jest to błąd.

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

Jak mogę zrobić to dobrze, aby zapisać do bazy danych z liczbą całkowitą?

+1

chciałbym pozostawić go jako 'int' w modelu i użyj gettera i setera. Komunikat o błędzie pojawia się najprawdopodobniej z ustawień reguły. Więc możesz tam zmienić swój weryfikator. –

+0

Tak, to prawda. – Francis

Odpowiedz

0

znalazłem rozwiązanie. W modelu Search (mój przypadek jest AttendanceSearch.php), znaleźć funkcję zasadami i przenieść for_date z linii mają integer poniżej linie mają safe

mój kod:

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

Według kodu for_date nadal jest w formacie dzień po dniu beforeValidate tras ze względu na linii:

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

Usuń ten wiersz i powinno działać.

Będą jednak nadal występować problemy, np. Formatowanie daty lub osoba wprowadzająca nieprawidłową datę, np. 30/02/2015.

Proponuję utworzyć osobną usługę, np. for_date_display i dodanie reguły daty dla tego. Następnie w beforeSave przekonwertować tę datę na znacznik czasu i ustawić for_date tej wartości w następujący sposób:

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); 
} 
+0

Dlaczego funkcja beforeSave? – Francis

+1

Ponieważ 'for_date' nie będzie wprowadzane/edytowane bezpośrednio przez użytkowników. Edytują 'for_date_display', a to musi zostać przekształcone do zapisu w bazie danych. – topher