wake-up-neo.com

Laravel Zeitstempel () erstellt kein CURRENT_TIMESTAMP

Ich habe eine Migration, die die timestamps()-Methode hat, und dann habe ich einen Samen, um diese Tabelle zu säen.

Schema::create('mytable', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->timestamps();
});

Der Samen sieht so aus:

DB::table('mytable')->insert([
    [
        'title' => 'My Awesome Title'
    ]
]);

Wenn alles läuft mit:

php artisan migrate:refresh --seed

Das Element wird eingefügt, aber die Werte von created_at und updated_at sind beide 0000-00-00 00:00:00. Warum werden sie nicht richtig festgelegt?

hier sind die Spaltenschemas, die es erstellt:

`created_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

Ich hätte gerne folgende Pläne:

`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
10
Get Off My Lawn

Wenn Sie Daten einfügen, die Eloquent nicht verwenden, müssen Sie selbst Zeitstempel einfügen.

Wenn du benutzt:

$x = new MyTable();
$x->title = 'My Awesome Title';
$x->save();

sie haben den Zeitstempel richtig gefüllt (natürlich müssen Sie zuerst das Modell MyTable erstellen).

EDIT

Wenn Sie es wirklich wollen, können Sie ändern:

$table->timestamps();

in:

$table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(\DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

Und wenn Sie ein Modell für diese Tabelle erstellen, sollten Sie festlegen

$timestamps = false;

um sicherzustellen, dass Eloquent nicht versucht, sie auf den Weg zu bringen.

EDIT2

Es gibt noch eine weitere wichtige Frage. Wenn Sie Einstellungsdaten in Tabellen aus PHP und in anderen in MySQL mischen, sollten Sie sicherstellen, dass sowohl in PHP als auch in MySQL die gleiche Datumszeit (und Zeitzone) angegeben ist oder Sie denselben Datumsvergleich verwenden wie Sie in Record aufnehmen (entweder MySQL oder PHP). Andernfalls erhalten Sie beim Ausführen von Abfragen möglicherweise unerwartete Ergebnisse

SELECT * FROM mytable WHERE DATE(created_at) = CURDATE()

unterscheidet sich möglicherweise von der Ausführung einer Abfrage mit dem Datum PHP

"SELECT * FROM mytable WHERE DATE(created_at) = '".date('Y-m-d")."'"

weil es auf dem PHP -Server beispielsweise 2015-12-29 sein kann, aber auf dem MySQL-Server 2015-12-30

24

Für spätere Versionen können Sie einfach verwenden. ( Quelle )

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
2
bmatovu

ich würde die Kohlenstoffbibliothek verwenden, wenn ich in den Zeitstempeln aussäse und diese in der Fabrik aufstelle. Wenn nicht, könnten Sie so etwas tun:

$timestamps = false;

und ich würde das $table->timestamps(); von der Migration entfernen, wenn ich es nicht verwenden werde.

0
Sari Yono