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.Para crear ambas columnas
created_at
yupdated_at
:Necesitará la versión de MySQL> = 5.6.5 para tener varias columnas con
CURRENT_TIMESTAMP
fuente
$table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));
?updated_at
no cambiaría cuando el registro fuera modificado después de su creación inicial$t->timestamps();
pero eso no responde la pregunta.A partir de Laravel 5.1.26, etiquetado el 02/12/2015,
useCurrent()
se ha agregado un modificador:PR 10962 (seguido de commit 15c487fe ) condujo a esta adición.
También puede leer los números 3602 y 11518 que son de interés.
Básicamente, MySQL 5.7 (con la configuración predeterminada) requiere que defina un valor predeterminado o que se pueda anular para los campos de tiempo.
fuente
Esto no funciona por un hecho:
No elimina el '0 predeterminado' que parece venir con la selección de la marca de tiempo y solo agrega el predeterminado personalizado. Pero lo necesitamos sin las comillas. No todo lo que manipula un DB proviene de Laravel4. Ese es su punto. Quiere valores predeterminados personalizados en ciertas columnas como:
No creo que sea posible con Laravel. He estado buscando durante una hora para ver si es posible.
Actualización: la respuesta de Paulos Freita muestra que es posible, pero la sintaxis no es sencilla.
fuente
Como posibilidad adicional para futuros googlers
Me resulta más útil tener nulo en la columna updated_at cuando se crea el registro pero nunca se ha modificado . Reduce el tamaño de la base de datos (ok, solo un poco) y es posible ver a primera vista que los datos nunca se han modificado.
A partir de esto uso:
(En Laravel 7 con mysql 8).
fuente
Utilice la sugerencia de Paulo Freitas en su lugar.
Hasta que Laravel corrija esto, puede ejecutar una consulta de base de datos estándar después deSchema::create
haberla ejecutado.Funcionó de maravilla para mí.
fuente
Así es como lo haces, lo he comprobado y funciona en mi Laravel 4.2.
Espero que esto ayude.
fuente
En Laravel 5 simplemente:
Documentación: http://laravel.com/docs/5.1/migrations#creating-columns
fuente
CURRENT_TIMESTAMP
encreated_at
columna yon UPDATE CURRENT_TIMESTAMP
enupdated_at
columna. Hasta que la gente de Laravel lo arregle, use esto:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));