Dado que es una expresión en bruto, debe usar DB::raw()
para establecer CURRENT_TIMESTAMP
como valor predeterminado para una columna:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Esto funciona perfectamente en cada controlador de base de datos.
Nuevo atajo
A partir de Laravel 5.1.25 (ver PR 10962 y commit 15c487fe ) puede usar el nuevo useCurrent()
método de modificación de columna para establecer el CURRENT_TIMESTAMP
valor predeterminado para una columna:
$table->timestamp('created_at')->useCurrent();
Volviendo a la pregunta, en MySQL también puede usar la ON UPDATE
cláusula a través de DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Gotchas
MySQL
Comenzando con 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 inserte registros en su base de datos. Puede usar el useCurrent()
modificador de columna (de Laravel 5.1.25 y superior) en sus migraciones para predeterminar las columnas de marca de tiempo a las marcas de tiempo actuales, o puede hacer que las marcas nullable()
de tiempo permitan valores nulos.
PostgreSQL y Laravel 4.x
En las versiones de Laravel 4.x, el controlador PostgreSQL estaba utilizando la precisión predeterminada de la base de datos para almacenar valores de marca de tiempo. Cuando se usa la 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 segunda parte fraccionaria - vea este violín de SQL .
Esto llevará a Carbon a fallar al analizar una marca de tiempo ya que no esperará que se almacenen microsegundos. Para evitar que este comportamiento inesperado rompa su aplicación, debe dar explícitamente una precisión cero a la CURRENT_TIMESTAMP
función de la siguiente manera:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Desde Laravel 5.0, las timestamp()
columnas se han cambiado para usar una precisión predeterminada de cero, lo que evita esto.
Gracias a @andrewhl por señalar este problema en los comentarios.
DB::statement
ejemplo, esto es mucho más simple.