2016-01-13 26 views
8

Ho appena finito un intoppo con timestamp di Eloquent (Laravel 5.2.10). Per impostazione predefinita, il metodo $table->timestamps() fornisce una colonna e una colonna updated_at nella tabella che vengono aggiornate di conseguenza.Laravel Eloquent created_at si aggiorna

Tuttavia, quando stavo cercando alcune voci di test, ho notato che quando si aggiorna un record, il campo updated_at viene aggiornato, come dovrebbe, ma il created_at campo anche viene aggiornato: le sue ore rimane al momento creato , ma i minuti e i secondi vengono aggiornati per corrispondere al campo updated_at.

Se era troppo prolisso, ecco un esempio:

+---------------------+---------------------+ 
| created_at   | updated_at   | 
+---------------------+---------------------+ 
| 2016-01-13 17:13:27 | 2016-01-13 22:13:27 | 
| 2016-01-13 16:14:41 | 2016-01-13 21:14:41 | 
+---------------------+---------------------+ 

Si noti che i minuti ei secondi sono la stessa identica per il campo created_at e updated_at.

Ho cercato di esaminare la classe Model in cui sono impostati i timestamp, ma risulta che il metodo setCreatedAt() non viene effettivamente chiamato quando si aggiorna un record.

Perché succede?
Come si impedisce la modifica del campo created_at? (Più importante)

risposta

5

Il tuo problema è probabilmente correlato a questo problema qui: https://github.com/laravel/framework/issues/11518

Per farla breve, created_at colonna di molte persone hanno avuto l'attributo ON UPDATE CURRENT_TIMESTAMP.

Come indicato nella pagina di Github:

MySQL 5.7 non consente più 0000-00-00 come un timestamp valido modalità rigorosa attivata (che lo è di default). Quindi utilizzare ->nullableTimestamps() o ->timestamp()->useCurrent().

Quindi, è possibile risolvere il problema modificando questo:

$table->timestamps(); 

Per una di queste opzioni:

// Option 1: 
$table->nullableTimestamps(); 

// Option 2: 
$table->timestamp('updated_at')->useCurrent(); 
$table->timestamp('created_at')->useCurrent(); 

Inoltre, in questa pagina MySQL: https://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

In alternativa, se explicit_defaults_for_timestamp è disabilitato (impostazione predefinita), fare eithe r dei seguenti:

Definire la colonna con una clausola DEFAULT che specifica un valore predefinito costante.

Specificare l'attributo NULL. Questo fa sì che la colonna permetta i valori NULL, il che significa che non è possibile assegnare il timestamp corrente impostando la colonna su NULL. Assegnando NULL si imposta la colonna su NULL.

+0

Ho eseguito un "aggiornamento del compositore" che mi ha portato fino alla 5.2.10, ma il metodo 'timestamps()' non funzionava ancora correttamente.Comunque, il 'nullableTimestamps()' funziona bene, quindi lo userò per ora (il problema che mi hai indicato sembrava indicare che questo sarebbe diventato il comportamento predefinito 'timestamps()', ma per ora non funziona ancora Comunque, grazie! – tam5

+1

@tam Ci scusiamo. A partire da 5 ore fa (Laravel 5.2.9+), le modifiche sono state ripristinate in modo che 'useCurrent()' non sia il comportamento predefinito. Ha causato alcuni problemi con le persone chi usa una versione precedente di MySQL. –

+0

nessun problema Grazie per l'alternativa e le spiegazioni – tam5

Problemi correlati