php - sola - migrar solo 1 tabla laravel
¿Cómo puedo establecer el valor predeterminado de una columna de marca de tiempo en la marca de tiempo actual con migraciones de Laravel? (8)
A partir de Laravel 5.1.26, etiquetado el 12/02/2015, se ha agregado un modificador useCurrent()
:
Schema::table(''users'', function ($table) {
$table->timestamp(''created'')->useCurrent();
});
PR 10962 (seguido de commit 15c487fe ) condujo a esta adición.
También puede leer los números 3602 y 11518 que sean de su interés.
Básicamente, MySQL 5.7 (con la configuración predeterminada) requiere que usted defina un valor predeterminado o un valor nulo para los campos de tiempo.
Me gustaría crear una columna de marca de tiempo con un valor predeterminado de CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
utilizando Laravel Schema Builder / Migrations. He revisado la documentación de Laravel varias veces y no veo cómo puedo hacer que sea la predeterminada para una columna de marca de tiempo.
La función timestamps()
hace que los valores predeterminados sean 0000-00-00 00:00
para ambas columnas.
Así es como lo haces, lo he comprobado y funciona en mi Laravel 4.2.
$table->timestamp(''created_at'')->default(DB::raw(''CURRENT_TIMESTAMP''));
Espero que esto ayude.
Dado que es una expresión sin formato, 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.
A partir de Laravel 5.1.25 (ver PR 10962 y confirmar 15c487fe ) puede usar el nuevo método de modificación de columna useCurrent()
para establecer CURRENT_TIMESTAMP
como un valor predeterminado para una columna:
$table->timestamp(''created_at'')->useCurrent();
Como se le preguntó, en MySQL también podría usar la cláusula ON UPDATE
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. Tal como se documenta en la guía de actualización de Laravel 5.2 , todas las columnas de marca de tiempo deberían recibir un valor predeterminado válido cuando inserte registros en su base de datos. Puede usar el modificador de columnauseCurrent()
(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 de tiempo seannullable()
para permitir valores nulos.PostgreSQL y Laravel 4.x
En las versiones 4.x de Laravel, el controlador PostgreSQL usaba la precisión de la base de datos predeterminada para almacenar los valores de marca de tiempo. Cuando se utiliza la funciónCURRENT_TIMESTAMP
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; consulte este violín de SQL .Esto conducirá a que Carbon falle al analizar una marca de tiempo, ya que no se espera que se almacenen microsegundos. Para evitar este comportamiento inesperado al romper su aplicación, debe dar una precisión cero a la función
CURRENT_TIMESTAMP
siguiente manera:$table->timestamp(''created_at'')->default(DB::raw(''CURRENT_TIMESTAMP(0)''));
Desde Laravel 5.0, las columnas
timestamp()
se han cambiado para usar una precisión predeterminada de cero que lo evita.Gracias a @andrewhl por señalar este problema en los comentarios.
En Laravel 5 simplemente:
$table->timestamps(); //Adds created_at and updated_at columns.
Documentación: http://laravel.com/docs/5.1/migrations#creating-columns
Esto no funciona para un hecho:
$table->timestamp(''created_at'')->default(''CURRENT_TIMESTAMP'');
No elimina el ''valor predeterminado 0'' que parece venir con la selección de la marca de tiempo y simplemente agrega el valor predeterminado personalizado. Pero lo necesitamos de alguna manera sin las comillas. No todo lo que manipula una base de datos proviene de Laravel4. Ese es su punto. Él quiere valores predeterminados personalizados en ciertas columnas como:
$table->timestamps()->default(''CURRENT_TIMESTAMP'');
No creo que sea posible con Laravel. He estado buscando durante una hora para ver si es posible.
Actualización: la answer Paulos Freita muestra que es posible, pero la sintaxis no es directa.
Para crear ambas columnas created_at
y updated_at
:
$t->timestamp(''created_at'')->default(DB::raw(''CURRENT_TIMESTAMP''));
$t->timestamp(''updated_at'')->default(DB::raw(''CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP''));
Necesitará la versión de MySQL> = 5.6.5 para tener múltiples columnas con CURRENT_TIMESTAMP
Utilice lo siguiente:
$table->timestamp(''created_at'')->nullable();
Con suerte, te ayudará. Gracias.
Use la suggestion Paulo Freitas en su lugar.
Hasta que Laravel lo corrija, puede ejecutar una consulta de base de datos estándar después de que se haya ejecutado Schema::create
.
Schema::create("users", function($table){
$table->increments(''id'');
$table->string(''email'', 255);
$table->string(''given_name'', 100);
$table->string(''family_name'', 100);
$table->timestamp(''joined'');
$table->enum(''gender'', [''male'', ''female'', ''unisex''])->default(''unisex'');
$table->string(''timezone'', 30)->default(''UTC'');
$table->text(''about'');
});
DB::statement("ALTER TABLE ".DB::getTablePrefix()."users CHANGE joined joined TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL");
Funcionó de maravillas para mí.