É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 leuseCurrent()
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 horodatagesnullable()
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 deCURRENT_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.