sql >> Database >  >> RDS >> Mysql

Hoe kan ik de standaardwaarde van een tijdstempelkolom instellen op de huidige tijdstempel met Laravel-migraties?

Aangezien het een onbewerkte uitdrukking is, moet u DB::raw() . gebruiken om CURRENT_TIMESTAMP in te stellen als standaardwaarde voor een kolom:

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

Dit werkt feilloos op elk databasestuurprogramma.

Vanaf Laravel 5.1.25 (zie PR 10962 en commit 15c487fe ) kunt u nu de nieuwe useCurrent() . gebruiken kolommodificatiemethode om dezelfde standaardwaarde voor een kolom te bereiken:

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

Terug naar de vraag, op MySQL zou je ook de ON UPDATE . kunnen gebruiken clausule via DB::raw() :

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

Nogmaals, vanaf Laravel 8.36.0 (zie PR 36817 ) kunt u nu de nieuwe useCurrentOnUpdate() . gebruiken kolommodificatiemethode samen met de useCurrent() modifier om dezelfde standaardwaarde voor een kolom te bereiken:

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

Gekregen

  • MySQL

    Vanaf MySQL 5.7, 0000-00-00 00:00:00 wordt niet langer als een geldige datum beschouwd. Zoals gedocumenteerd in de Laravel 5.2 upgradehandleiding , moeten alle tijdstempelkolommen een geldige standaardwaarde krijgen wanneer u records in uw database invoegt. U kunt de useCurrent() . gebruiken kolommodifier (van Laravel 5.1.25 en hoger) in uw migraties om de tijdstempelkolommen standaard op de huidige tijdstempels te zetten, of u kunt de tijdstempels nullable() maken om null-waarden toe te staan.

  • PostgreSQL en Laravel 4.x

    In Laravel 4.x-versies gebruikte het PostgreSQL-stuurprogramma de standaard databaseprecisie om tijdstempelwaarden op te slaan. Bij gebruik van de CURRENT_TIMESTAMP functie op een kolom met een standaardprecisie, genereert PostgreSQL een tijdstempel met de hogere beschikbare precisie, waardoor een tijdstempel wordt gegenereerd met een fractioneel tweede deel - zie deze SQL-viool .

    Dit zal ertoe leiden dat Carbon een tijdstempel niet kan ontleden, omdat het niet verwacht dat microseconden worden opgeslagen. Om te voorkomen dat dit onverwachte gedrag uw toepassing verbreekt, moet u expliciet een nulprecisie geven aan de CURRENT_TIMESTAMP functie zoals hieronder:

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

    Sinds Laravel 5.0, timestamp() kolommen is gewijzigd om een ​​standaardprecisie van nul te gebruiken, waardoor dit wordt vermeden.

Met dank aan @andrewhl voor het wijzen op het Laravel 4.x-probleem in de opmerkingen.

Met dank aan @ChanakaKarunarathne voor het uitbrengen van de nieuwe useCurrentOnUpdate() snelkoppeling in de opmerkingen.



  1. Rails 3.1 - Pushen naar Heroku - Fouten bij het installeren van de postgres-adapter?

  2. SQL Server:de donkere kant van NVARCHAR

  3. Tabel maken met het datumstempel

  4. Python:gegevens opvragen op geluid