Comment puis-je Définir la Valeur par Défaut d'une Colonne de type Timestamp à l'Horodatage Actuel avec Laravel Migrations?
Je voudrais faire une colonne timestamp avec une valeur par défaut de CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
à l'aide de la Laravel Générateur de Schéma/Migrations. Je suis passé par le Laravel documentation à plusieurs reprises, et je ne vois pas comment je peux faire que la valeur par défaut pour une colonne de type timestamp.
La timestamps()
fonction, les valeurs par défaut 0000-00-00 00:00
pour les deux colonnes qu'il fait.
Vous devez vous connecter pour publier un commentaire.
Donné que c'est un raw expression, vous devez utiliser
DB::raw()
pour définirCURRENT_TIMESTAMP
comme valeur par défaut pour une colonne:Cela fonctionne parfaitement sur tous les pilote de base de données.
Nouveau raccourci
De Laravel 5.1.25 (voir PR 10962 et s'engager 15c487fe) vous pouvez utiliser la nouvelle
useCurrent()
modificateur de colonne de méthode pour définir leCURRENT_TIMESTAMP
comme valeur par défaut pour une colonne:Revenir à la question, sur MySQL, vous pouvez également utiliser la
ON UPDATE
clause parDB::raw()
:Pièges
MySQL
Départ avec MySQL 5.7,
0000-00-00 00:00:00
n'est plus considéré comme une date valide. Comme indiqué à la Laravel 5.2 guide de mise à niveau, toutes les colonnes de type timestamp doit recevoir une valeur par défaut valide lorsque vous insérez des enregistrements dans votre base de données. Vous pouvez utiliser leuseCurrent()
colonne modificateur (à partir de Laravel 5.1.25 et ci-dessus) dans votre migrations à défaut les colonnes timestamp actuel de l'horodatage, ou vous pouvez faire les horodateursnullable()
pour autoriser les valeurs null.PostgreSQL & Laravel 4.x
Dans Laravel 4.versions x, le pilote PostgreSQL a l'aide de la base de données par défaut de précision pour stocker des 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 timestamp avec la plus grande précision disponible, générant ainsi un timestamp avec une fraction de seconde partie - voir ce SQL violon.Ce qui entraînera de Carbone à l'échec de l'analyse d'un timestamp, car il ne s'attend microsecondes d'être stockés. Pour éviter ce comportement inattendu de casser votre application, vous devez indiquer explicitement un zéro de la précision à la
CURRENT_TIMESTAMP
fonction comme ci-dessous:Depuis Laravel 5.0,
timestamp()
colonnes a été modifié pour utiliser une valeur par défaut de précision de zéro, ce qui permet d'éviter cela.Grâce à @andrewhl de remarquer cette question dans les commentaires.
DB::statement
exemple, c'est beaucoup plus simple.De créer à la fois de la
created_at
etupdated_at
colonnes:Vous aurez besoin de la version de MySQL >= 5.6.5 d'avoir plusieurs colonnes avec
CURRENT_TIMESTAMP
$table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));
?updated_at
ne change 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, marqué sur 2015-12-02, un
useCurrent()
modificateur a été ajouté:PR 10962 (suivi par s'engager 15c487fe) au plomb à cet ajout.
Vous pouvez également lire les questions Trois mille six cent deux et Onze mille cinq cent dix huit qui sont d'intérêt.
Fondamentalement, MySQL 5.7 (avec la config par défaut) nécessite de définir une valeur par défaut ou les valeurs null pour les champs d'heure.
Utilisation Paulo Freitas suggestion à la place.
Jusqu'à ce que Laravel corrige cela, vous pouvez exécuter une base de données standard de la requête après laSchema::create
ont été exécutés.Il a fait des merveilles pour moi.
Cela ne fonctionne pas pour un fait:
Il n'est pas supprimer la valeur "par défaut 0' qui semble venir avec la sélection d'horodatage et il ajoute la coutume par défaut. Mais nous avons besoin sans les guillemets. Tout n'est pas que manipule un DB est à venir à partir de Laravel4. C'est son point de vue. Il veut la coutume par défaut sur certaines colonnes, comme:
Je ne pense pas que c'est possible avec Laravel. J'ai cherché pendant une heure pour voir si c'est possible.
Mise à jour: Paulos Freita de réponse montre qu'il est possible, mais la syntaxe n'est pas simple.
C'est comment vous le faites, j'ai vérifié et il fonctionne sur mon Laravel 4.2.
Espère que cette aide.
Dans Laravel 5 simplement:
Documentation: http://laravel.com/docs/5.1/migrations#creating-columns
CURRENT_TIMESTAMP
surcreated_at
colonne eton UPDATE CURRENT_TIMESTAMP
surupdated_at
colonne. Jusqu'à les gens à Laravel fixer, utilisez ceci:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
Utiliserl'suivantes:
$table->timestamp('created_at')->nullable();
J'espère que cela pourra vous aider. Merci.