É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.
Nouveau raccourci
Depuis Laravel 5.1.25 (voir PR 10962 et commit 15c487fe ), vous pouvez utiliser la nouvelle useCurrent()
méthode de modificateur de colonne pour définir CURRENT_TIMESTAMP
comme valeur par défaut pour une colonne:
$table->timestamp('created_at')->useCurrent();
De retour à la question, sur MySQL, vous pouvez également utiliser la ON UPDATE
clause via DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Gotchas
MySQL
À partir de MySQL 5.7, 0000-00-00 00:00:00
n'est plus considéré comme une date valide. Comme indiqué dans le guide de mise à niveau de 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 créer 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 la 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 partie - voir ce violon SQL .
Cela conduira Carbon à échouer l'analyse d'un horodatage car il ne s'attendra pas à ce que les microsecondes soient stockées. Pour éviter que ce comportement inattendu ne casse votre application, vous devez explicitement donner une précision nulle à la CURRENT_TIMESTAMP
fonction comme ci-dessous:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Depuis Laravel 5.0, les timestamp()
colonnes ont été modifiées pour utiliser une précision par défaut de zéro, ce qui évite cela.
Merci à @andrewhl d' avoir signalé ce problème dans les commentaires.
DB::statement
exemple, c'est beaucoup plus simple.Pour créer à la fois les colonnes
created_at
etupdated_at
:Vous aurez besoin de la version MySQL> = 5.6.5 pour avoir plusieurs colonnes avec
CURRENT_TIMESTAMP
la source
$table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));
?updated_at
cela ne changerait pas lorsque l'enregistrement a été modifié après sa création initiale$t->timestamps();
mais cela ne répond pas à la question.À partir de Laravel 5.1.26, tagué le 02/12/2015, un
useCurrent()
modificateur a été ajouté:Le PR 10962 (suivi du commit 15c487fe ) a conduit à cet ajout.
Vous pouvez également lire les numéros 3602 et 11518 qui vous intéressent.
Fondamentalement, MySQL 5.7 (avec la configuration par défaut) vous oblige à définir une valeur par défaut ou Nullable pour les champs de temps.
la source
Cela ne fonctionne pas pour un fait:
Il ne supprime pas le «0 par défaut» qui semble venir avec la sélection de l'horodatage et ajoute simplement la valeur par défaut personnalisée. Mais nous en avons besoin sans les guillemets. Tout ce qui manipule une base de données ne vient pas de Laravel4. C'est son point. Il veut des valeurs par défaut personnalisées sur certaines colonnes comme:
Je ne pense pas que ce soit possible avec Laravel. Je cherche depuis une heure maintenant pour voir si c'est possible.
Mise à jour: la réponse de Paulos Freita montre que c'est possible, mais la syntaxe n'est pas simple.
la source
Comme possibilité supplémentaire pour les futurs googleurs
Je trouve plus utile d'avoir null dans la colonne updated_at lorsque l'enregistrement est créé mais n'a jamais été modifié . Cela réduit la taille de la base de données (ok, juste un peu) et il est possible de voir à première vue que les données n'ont jamais été modifiées.
À partir de là, j'utilise:
(Dans Laravel 7 avec mysql 8).
la source
Utilisez plutôt la suggestion de Paulo Freitas .
Jusqu'à ce que Laravel corrige cela, vous pouvez exécuter une requête de base de données standard aprèsSchema::create
avoir été exécuté.Cela a fonctionné à merveille pour moi.
la source
Voici comment vous faites, je l'ai vérifié et cela fonctionne sur mon Laravel 4.2.
J'espère que cela t'aides.
la source
Dans Laravel 5 simplement:
Documentation: http://laravel.com/docs/5.1/migrations#creating-columns
la source
CURRENT_TIMESTAMP
surcreated_at
colonne eton UPDATE CURRENT_TIMESTAMP
surupdated_at
colonne. Jusqu'à ce que les gens de Laravel le réparent, utilisez ceci:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));