2016-01-13 3 views
8

Ich habe gerade einen Fehler mit Eloquent's (Laravel 5.2.10) Standard-Zeitstempeln gefunden. Standardmäßig gibt Ihnen die $table->timestamps() Methode eine created_at und eine updated_at Spalte in Ihrer Tabelle, die entsprechend aktualisiert werden.Laravel Eloquent created_at wird aktualisiert

Allerdings, wenn ich einige Testeinträge versuche, bemerkte ich, dass, wenn Sie einen Datensatz aktualisieren, das updated_at Feld aktualisiert wird, wie es soll, aber das created_at Feld auch bekommt aktualisiert: seine Stunden am erstellten Zeit bleibt , aber die Minuten und Sekunden werden aktualisiert, um dem Feld updated_at zu entsprechen.

Wenn das zu wortreich war, hier ein Beispiel:

+---------------------+---------------------+ 
| 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 | 
+---------------------+---------------------+ 

Beachten Sie, dass die Minuten und Sekunden sind genau das gleiche für das created_at und updated_at Feld.

Ich habe versucht, durch die Klasse zu sehen, wo die Zeitstempel gesetzt sind, aber es stellt sich heraus, setCreatedAt() Methode wird in der Tat nicht aufgerufen, wenn nur einen Datensatz aktualisieren.

Warum passiert das? Wie kann ich verhindern, dass sich das Feld created_at ändert? (Wichtiger)

Antwort

5

Ihr Problem ist wahrscheinlich zu diesem Problem hier: https://github.com/laravel/framework/issues/11518

Lange Rede kurzer Sinn, die viele Menschen created_at Spalte hatte das Attribut ON UPDATE CURRENT_TIMESTAMP.

Wie auf der Github Seite angegeben:

MySQL 5.7 nicht mehr erlaubt 0000-00-00 als ein gültiger Zeitstempel mit Strict-Modus eingeschaltet (die es standardmäßig ist). Verwenden Sie also entweder ->nullableTimestamps() oder ->timestamp()->useCurrent().

So können Sie dieses Problem beheben, indem diese zu ändern:

$table->timestamps(); 

Um eine dieser Optionen:

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

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

Auch auf dieser MySQL Seite: https://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

Wenn alternativ explicit_defaults_for_timestamp deaktiviert ist (Standard), tun Sie dies r der folgenden:

Definieren Sie die Spalte mit einer DEFAULT-Klausel, die einen konstanten Standardwert angibt.

Geben Sie das NULL-Attribut an. Dies führt auch dazu, dass die Spalte NULL-Werte zulässt, was bedeutet, dass Sie den aktuellen Zeitstempel nicht zuweisen können, indem Sie die Spalte auf NULL setzen. Wenn NULL zugewiesen wird, wird die Spalte auf NULL festgelegt.

+0

Ich habe ein 'Composer-Update' ausgeführt, das mich zu 5.2.10 brachte, aber die Methode' timestamps() 'funktionierte immer noch nicht richtig.Die 'nullableTimestamps()' funktioniert jedoch gut, also werde ich das für jetzt verwenden (Das Problem, auf das Sie mich hingewiesen haben, schien darauf hinzuweisen, dass dies das '' tempestamps() '' - Verhalten wird, aber im Moment funktioniert es immer noch nicht Für mich jedenfalls, danke! – tam5

+1

@tam Entschuldigung, vor 5 Stunden (Laravel 5.2.9+) wurden die Änderungen zurückgesetzt, so dass 'useCurrent()' nicht das Standardverhalten ist und einige Probleme mit Leuten verursacht hat wer benutzt eine ältere Version von MySQL –

+0

kein Problem, Danke für die Alternative und Erklärungen – tam5