web-dev-qa-db-de.com

Wie kann ich den Standardwert einer Zeitstempelsäule auf den aktuellen Zeitstempel bei Laravel-Migrationen setzen?

Ich möchte mit dem Laravel Schema Builder/Migrations eine Zeitstempelspalte mit dem Standardwert CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP erstellen. Ich habe die Laravel-Dokumentation mehrmals durchgesehen und sehe nicht, wie ich dies als Standard für eine Zeitstempelsäule festlegen kann.

Die Funktion timestamps() legt die Standardwerte für 0000-00-00 00:00 für beide Spalten fest.

108
JoeyD473

Da es sich um einen unformatierten Ausdruck handelt, sollten Sie DB::raw() verwenden, um CURRENT_TIMESTAMP als Standardwert für eine Spalte festzulegen:

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

Dies funktioniert einwandfrei für jeden Datenbanktreiber.

Ab Laravel 5.1.25 (siehe PR 10962 und commit 15c487fe ) können Sie die neue Spaltenmodifikationsmethode useCurrent() verwenden, um den CURRENT_TIMESTAMP als Standardwert für eine Spalte festzulegen:

$table->timestamp('created_at')->useCurrent();

In MySQL können Sie auch die ON UPDATE-Klausel über DB::raw() verwenden:

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

Gotchas

  • MySQL

    Ab MySQL 5.7 gilt 0000-00-00 00:00:00 nicht mehr als gültiges Datum. Wie in Laravel 5.2 Upgrade Guide beschrieben, sollten alle Zeitstempelspalten einen gültigen Standardwert erhalten, wenn Sie Datensätze in Ihre Datenbank einfügen. Sie können den Spaltenmodifizierer useCurrent() (von Laravel 5.1.25 und höher) in Ihren Migrationen verwenden, um die Zeitstempelspalten auf die aktuellen Zeitstempel zu setzen, oder Sie können die Zeitstempel nullable() so festlegen, dass Nullwerte zulässig sind.

  • PostgreSQL & Laravel 4.x

    In Laravel 4.x-Versionen verwendete der PostgreSQL-Treiber die Standard-Datenbankgenauigkeit, um Zeitstempelwerte zu speichern. Wenn Sie die CURRENT_TIMESTAMP-Funktion für eine Spalte mit einer Standardgenauigkeit verwenden, generiert PostgreSQL einen Zeitstempel mit der höheren verfügbaren Genauigkeit, wodurch ein Zeitstempel mit einem Sekundenbruchteil erzeugt wird - siehe diese SQL-Geige .

    Dies führt dazu, dass Carbon das Parsen eines Zeitstempels nicht ausführen kann, da keine Speicherung von Mikrosekunden erwartet wird. Um zu verhindern, dass dieses unerwartete Verhalten Ihre Anwendung beschädigt, müssen Sie der CURRENT_TIMESTAMP-Funktion wie folgt explizit eine Null-Genauigkeit zuweisen:

    $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
    

    Seit Laravel 5.0 wurden timestamp() Spalten geändert, um eine Standardgenauigkeit von Null zu verwenden, wodurch dies vermieden wird.

    Danke an @andrewhl für den Hinweis auf dieses Problem in den Kommentaren.

210
Paulo Freitas

So erstellen Sie die beiden Spalten created_at und updated_at:

$t->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$t->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));

Sie benötigen MySQL-Version> = 5.6.5, um mehrere Spalten mit CURRENT_TIMESTAMP zu haben.

40
Brian Adams

Beginnend mit Laravel 5.1.26, markiert am 02.12.2015, wurde ein useCurrent() Modifier hinzugefügt:

Schema::table('users', function ($table) {
    $table->timestamp('created')->useCurrent();
});

PR 10962 (gefolgt von Festschreiben 15c487fe ) führte zu dieser Addition.

Möglicherweise möchten Sie auch die Ausgaben 3602 und 11518 lesen, die von Interesse sind.

Grundsätzlich müssen Sie in MySQL 5.7 (mit der Standardkonfiguration) entweder einen Standardwert definieren oder für Zeitfelder einen Nullwert festlegen.

25
Gras Double

Verwenden Sie stattdessen Paulo Freitas Vorschlag .


Bis Laravel das behoben hat, können Sie eine Standarddatenbankabfrage ausführen, nachdem Schema::create ausgeführt wurde.

    Schema::create("users", function($table){
        $table->increments('id');
        $table->string('email', 255);
        $table->string('given_name', 100);
        $table->string('family_name', 100);
        $table->timestamp('joined');
        $table->enum('gender', ['male', 'female', 'unisex'])->default('unisex');
        $table->string('timezone', 30)->default('UTC');
        $table->text('about');
    });
    DB::statement("ALTER TABLE ".DB::getTablePrefix()."users CHANGE joined joined TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL");

Es hat Wunder für mich gewirkt.

8
Marwelln

Das funktioniert nicht für eine Tatsache:

$table->timestamp('created_at')->default('CURRENT_TIMESTAMP');

Der 'Standardwert 0', der mit dem Auswählen des Zeitstempels verbunden ist, wird nicht entfernt, und der benutzerdefinierte Standardwert wird einfach angehängt. Aber wir brauchen es irgendwie ohne die Anführungszeichen. Nicht alles, was eine DB manipuliert, stammt von Laravel4. Das ist sein Punkt. Er möchte benutzerdefinierte Vorgaben für bestimmte Spalten wie:

$table->timestamps()->default('CURRENT_TIMESTAMP');

Ich glaube nicht, dass es mit Laravel möglich ist. Ich suche nun schon seit einer Stunde, ob es möglich ist.


Update: Paulos Freitas answer zeigt, dass dies möglich ist, aber die Syntax ist nicht einfach. 

6
Glenn Plas

Ich habe dies für laravel 5.X in der Benutzertabelle created_at verwendet, um die Zeitstempel bei der Datensatzerstellung automatisch festzulegen. (Wir haben einen Client, der Benutzer direkt in die Datenbank eingeben möchte, also musste ich sicherstellen, dass die Zeitstempel gesetzt wurden.)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Carbon\Carbon;

class UpdatingUserTableTimeStampsForAccuracy extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dateTime('created_at')->change()->default(\Carbon\Carbon::now());
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dateTime('created_at')->change();
        });
    }
}

Verwenden Sie diese Zeile, wenn Sie eine Änderungsmigration durchführen.

Wenn Sie ein Fan von Carbon sind, funktioniert dies großartig!

Oder wenn Sie dies in Ihrer Migration zur Tabellenerstellung festlegen.

 $table->dateTime('created_at')->default(\Carbon\Carbon::now());
2
dustbuster

Verwenden Sie Folgendes:

$table->timestamp('created_at')->nullable();

Hoffentlich wird es Ihnen helfen. Danke.

0
Foysal Nibir

So machst du es, ich habe es überprüft und es funktioniert auf meinem Laravel 4.2.

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

Hoffe das hilft.

0
Jawad

In Laravel 5 einfach:

$table->timestamps(); //Adds created_at and updated_at columns.

Dokumentation: http://laravel.com/docs/5.1/migrations#creating-columns

0
JoenMarz