Mysql
 sql >> Base de données >  >> RDS >> Mysql

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

Étant donné qu'il s'agit d'une expression brute, vous devez utiliser DB::raw() pour définir CURRENT_TIMESTAMP comme valeur par défaut pour une colonne :

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

Cela fonctionne parfaitement sur chaque pilote de base de données.

Depuis Laravel 5.1.25 (voir PR 10962 et commit 15c487fe ) vous pouvez maintenant utiliser le nouveau useCurrent() méthode de modificateur de colonne pour obtenir la même valeur par défaut pour une colonne :

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

Revenons à la question, sur MySQL, vous pouvez également utiliser le ON UPDATE clause via DB::raw() :

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

Encore une fois, depuis Laravel 8.36.0 (voir PR 36817 ) vous pouvez maintenant utiliser le nouveau useCurrentOnUpdate() méthode de modificateur de colonne avec useCurrent() modificateur pour obtenir la même valeur par défaut pour une colonne :

$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();

Les pièges

  • MySQL

    À partir de MySQL 5.7, 0000-00-00 00:00:00 n'est plus considérée comme une date valide. Comme documenté dans le Guide de mise à niveau Laravel 5.2 , toutes les colonnes d'horodatage doivent recevoir une valeur par défaut valide lorsque vous insérez des enregistrements dans votre base de données. Vous pouvez utiliser le useCurrent() modificateur de colonne (à partir de Laravel 5.1.25 et supérieur) dans vos migrations pour définir par défaut les colonnes d'horodatage sur les horodatages actuels, ou vous pouvez rendre les horodatages nullable() pour autoriser les valeurs nulles.

  • PostgreSQL et Laravel 4.x

    Dans les versions Laravel 4.x, le pilote PostgreSQL utilisait la précision de base de données par défaut pour stocker les valeurs d'horodatage. Lors de l'utilisation de CURRENT_TIMESTAMP fonction sur une colonne avec une précision par défaut, PostgreSQL génère un horodatage avec la plus grande précision disponible, générant ainsi un horodatage avec une fraction de seconde - voir ce violon SQL .

    Cela conduira Carbon à échouer dans l'analyse d'un horodatage car il ne s'attendra pas à ce que des microsecondes soient stockées. Pour éviter que ce comportement inattendu ne casse votre application, vous devez donner explicitement une précision nulle au CURRENT_TIMESTAMP fonctionnent comme ci-dessous :

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

    Depuis Laravel 5.0, timestamp() colonnes a été modifiée pour utiliser une précision par défaut de zéro qui évite cela.

Merci à @andrewhl pour avoir signalé le problème de Laravel 4.x dans les commentaires.

Merci à @ChanakaKarunarathne pour avoir sorti le nouveau useCurrentOnUpdate() raccourci dans les commentaires.