sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan jeg indstille standardværdien for en tidsstempelkolonne til det aktuelle tidsstempel med Laravel-migreringer?

Da det er et råt udtryk, bør du bruge DB::raw() for at indstille CURRENT_TIMESTAMP som standardværdi for en kolonne:

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

Dette fungerer upåklageligt på alle databasedrivere.

Fra Laravel 5.1.25 (se PR 10962 og commit 15c487fe ) kan du nu bruge den nye useCurrent() kolonnemodifikatormetode for at opnå den samme standardværdi for en kolonne:

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

Tilbage til spørgsmålet, på MySQL kan du også bruge ON UPDATE klausul gennem DB::raw() :

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

Igen, fra Laravel 8.36.0 (se PR 36817 ) kan du nu bruge den nye useCurrentOnUpdate() kolonnemodifikatormetoden sammen med useCurrent() modifikator for at opnå den samme standardværdi for en kolonne:

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

Gotchas

  • MySQL

    Starter med MySQL 5.7, 0000-00-00 00:00:00 betragtes ikke længere som en gyldig dato. Som dokumenteret i Laravel 5.2-opgraderingsvejledningen , bør alle tidsstempelkolonner modtage en gyldig standardværdi, når du indsætter poster i din database. Du kan bruge useCurrent() kolonnemodifikator (fra Laravel 5.1.25 og nyere) i dine migreringer til standardtidsstempelkolonnerne til de aktuelle tidsstempler, eller du kan gøre tidsstemplerne nullable() for at tillade nulværdier.

  • PostgreSQL &Laravel 4.x

    I Laravel 4.x-versioner brugte PostgreSQL-driveren standarddatabasenøjagtigheden til at gemme tidsstempelværdier. Når du bruger CURRENT_TIMESTAMP funktion på en kolonne med en standardpræcision, genererer PostgreSQL et tidsstempel med den højere præcision, der er tilgængelig, og genererer således et tidsstempel med en brøkdel af anden del - se denne SQL-fiol .

    Dette vil få Carbon til at mislykkes med at parse et tidsstempel, da det ikke vil forvente, at mikrosekunder bliver gemt. For at undgå, at denne uventede adfærd bryder din applikation, skal du udtrykkeligt give en nul-præcision til CURRENT_TIMESTAMP fungerer som nedenfor:

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

    Siden Laravel 5.0, timestamp() kolonner er blevet ændret til at bruge en standardpræcision på nul, hvilket undgår dette.

Tak til @andrewhl for at påpege Laravel 4.x-problemet i kommentarerne.

Tak til @ChanakaKarunarathne for at bringe den nye useCurrentOnUpdate() ud genvej i kommentarerne.



  1. Hvordan opretter man en fremmednøgle med ON UPDATE CASCADE på Oracle?

  2. Hvordan ved jeg, hvornår min docker mysql-beholder er oppe, og mysql er klar til at tage forespørgsler?

  3. PHP MySQLI Forhindrer SQL-injektion

  4. En Marathon Training App Data Model