Étant donné qu'il s'agit d'une expression brute, vous devriez utiliser DB::raw()
pour fixer CURRENT_TIMESTAMP
comme valeur par défaut pour une colonne :
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Cela fonctionne parfaitement avec tous les pilotes de base de données.
À partir de Laravel 5.1.25 (voir PR 10962 y commit 15c487fe ), vous pouvez désormais utiliser la nouvelle useCurrent()
pour obtenir la même valeur par défaut pour une colonne :
$table->timestamp('created_at')->useCurrent();
Pour en revenir à la question, sur MySQL, vous pouvez également utiliser le fichier ON UPDATE
clause par DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Là encore, à partir de Laravel 8.36.0 (voir PR 36817 ), vous pouvez désormais utiliser la nouvelle useCurrentOnUpdate()
ainsi que la méthode de modification de la colonne useCurrent()
pour obtenir la même valeur par défaut pour une colonne :
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Gotchas
-
MySQL
À partir de MySQL 5.7, 0000-00-00 00:00:00
n'est plus considérée comme une date valide. Comme le documente le Guide de mise à niveau de Laravel 5.2 Dans le cas de l'horodatage, 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 l'option useCurrent()
(à partir de Laravel 5.1.25 et plus) dans vos migrations pour que les colonnes d'horodatage prennent par défaut les horodatages actuels, ou vous pouvez faire en sorte que 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 par défaut de la base de données pour stocker les valeurs d'horodatage. Lorsque l'on utilisait l'option CURRENT_TIMESTAMP
sur une colonne avec une précision par défaut, PostgreSQL génère un horodatage avec la plus haute précision disponible, générant ainsi un horodatage avec une seconde partie fractionnaire - voir cette manipulation SQL .
Cela conduira Carbon à ne pas analyser un timestamp car il ne s'attend pas à ce que des microsecondes soient stockées. Pour éviter que ce comportement inattendu ne perturbe votre application, vous devez explicitement donner une précision de zéro à la variable CURRENT_TIMESTAMP
comme ci-dessous :
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Depuis Laravel 5.0, timestamp()
a été modifié pour utiliser une précision par défaut de zéro, ce qui évite ce problème.
Merci à @andrewhl pour avoir signalé le problème de Laravel 4.x dans les commentaires.
Merci à @ChanakaKarunarathne pour avoir fait ressortir le nouveau useCurrentOnUpdate()
raccourci dans les commentaires.