sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo puedo establecer el valor predeterminado de una columna de marca de tiempo en la marca de tiempo actual con migraciones de Laravel?

Dado que es una expresión sin procesar, debe usar DB::raw() para configurar CURRENT_TIMESTAMP como valor predeterminado para una columna:

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

Esto funciona perfectamente en todos los controladores de bases de datos.

A partir de Laravel 5.1.25 (ver PR 10962 y confirmar 15c487fe ) ahora puede usar el nuevo useCurrent() método modificador de columna para lograr el mismo valor predeterminado para una columna:

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

Volviendo a la pregunta, en MySQL también podría usar ON UPDATE cláusula a través de DB::raw() :

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

De nuevo, a partir de Laravel 8.36.0 (ver PR 36817 ) ahora puede usar el nuevo useCurrentOnUpdate() método modificador de columna junto con useCurrent() modificador para lograr el mismo valor predeterminado para una columna:

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

Errores

  • MySQL

    A partir de MySQL 5.7, 0000-00-00 00:00:00 ya no se considera una fecha válida. Como se documenta en la Guía de actualización de Laravel 5.2 , todas las columnas de marca de tiempo deben recibir un valor predeterminado válido cuando inserta registros en su base de datos. Puede usar useCurrent() modificador de columna (desde Laravel 5.1.25 y superior) en sus migraciones para que las columnas de marca de tiempo predeterminadas sean las marcas de tiempo actuales, o puede hacer que las marcas de tiempo nullable() para permitir valores nulos.

  • PostgreSQL y Laravel 4.x

    En las versiones de Laravel 4.x, el controlador PostgreSQL usaba la precisión de base de datos predeterminada para almacenar valores de marca de tiempo. Al usar el CURRENT_TIMESTAMP función en una columna con una precisión predeterminada, PostgreSQL genera una marca de tiempo con la mayor precisión disponible, generando así una marca de tiempo con una fracción de segundo - ver este violín SQL .

    Esto hará que Carbon falle al analizar una marca de tiempo, ya que no esperará que se almacenen microsegundos. Para evitar este comportamiento inesperado que rompe su aplicación, debe dar explícitamente una precisión cero a CURRENT_TIMESTAMP funciona de la siguiente manera:

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

    Desde Laravel 5.0, timestamp() las columnas se han cambiado para usar una precisión predeterminada de cero que evita esto.

Gracias a @andrewhl por señalar el problema de Laravel 4.x en los comentarios.

Gracias a @ChanakaKarunarathne por presentar el nuevo useCurrentOnUpdate() atajo en los comentarios.