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 usaruseCurrent()
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 tiemponullable()
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 elCURRENT_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.