255 votes

Comment puis-je définir la valeur par défaut d'une colonne d'horodatage sur l'horodatage actuel avec les migrations Laravel ?

Je voudrais créer une colonne d'horodatage avec une valeur par défaut de CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP en utilisant le Laravel Schema Builder/Migrations. J'ai parcouru plusieurs fois la documentation de Laravel, et je ne vois pas comment je peux faire en sorte que ce soit la valeur par défaut pour une colonne d'horodatage.

El timestamps() rend les valeurs par défaut 0000-00-00 00:00 pour les deux colonnes qu'il fait.

13voto

user311086 Points 340

Dans laravel 7, pour définir l'heure actuelle, utilisez ce qui suit :

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

9voto

Marwelln Points 4261

Utiliser Paulo Freitas suggestion à la place.


Jusqu'à ce que Laravel corrige ce problème, vous pouvez exécuter une requête standard de base de données après l'option Schema::create ont été exécutés.

    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");

Ça a fait des merveilles pour moi.

8voto

Si vous cherchez à définir la date actuelle pour une colonne dateTime (comme je l'ai fait en cherchant sur Google), utilisez cette méthode

$table->dateTime('signed_when')->useCurrent();

1voto

Dream Ideation Points 133

J'utilise la personnalisation suivante dans Laravel pour :

  1. Par défaut, created_at correspond à l'horodatage actuel.
  2. Mettre à jour l'horodatage lorsque l'enregistrement est mis à jour

D'abord, je vais créer un fichier, helpers.php dans la racine de Laravel et insérez ce qui suit :

<?php

if (!function_exists('database_driver')) {
    function database_driver(): string
    {
        $connection = config('database.default');
        return config('database.connections.' . $connection . '.driver');
    }
}

if (!function_exists('is_database_driver')) {
    function is_database_driver(string $driver): bool
    {
        return $driver === database_driver();
    }
}

Dans composer.json, je vais insérer ce qui suit dans autoload . Cela permet au compositeur de découvrir automatiquement les aides.php.

    "autoload": {
        "files": [
            "app/Services/Uploads/Processors/processor_functions.php",
            "app/helpers.php"
        ]
    },

J'utilise les éléments suivants dans mes modèles Laravel.

        if (is_database_driver('sqlite')) {
            $table->timestamps();
        } else {
            $table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
            $table->timestamp('updated_at')
                ->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
        }

Cela permet à mon équipe de continuer à utiliser sqlite pour les tests unitaires. ON UPDATE CURRENT_TIMESTAMP est un raccourci MySQL et n'est pas disponible dans sqlite.

-1voto

Jawad Points 85

Voici comment faire, je l'ai vérifié et cela fonctionne sur mon Laravel 4.2.

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

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X