🎃 12 meses por 75 €

El plan anual a mitad de precio hasta el 31 de octubre.

Aprovechar la oferta

🎃 Halloween: 12 meses por 75 €

Plan anual a mitad de precio, para altas y renovaciones. Solo hasta el 31 de octubre.
Aprovechar la oferta
Saltar al contenido
Curso Actualizar un proyecto de Laravel 10 a Laravel 11
08/13 La actualización a Laravel 11 Migraciones en Laravel 11: columnas modificadas con change() y tipos float
Tu lectura Quedan 11 min
Lección 8 de 13 · La actualización a Laravel 11

Migraciones en Laravel 11: columnas modificadas con change() y tipos float

11 min de lectura Laravel 11

Hola, bienvenido. En esta lección vamos a resolver los 2 cambios de la guía de Laravel 11 que afectan a las migraciones del proyecto, los 2 marcados como de impacto alto. En Laravel 11, una migración que modifica una columna con change() pierde los modificadores que no repite, como el valor por defecto, y float() ya no admite el total de dígitos y los decimales, solo la precisión.

Uno de los 2 lo señala Larastan desde la lección 5. El otro no lo detecta nada: ni los tests, ni Larastan, ni el proyecto en marcha. Por eso, antes de corregirlo, vamos a escribir un test que lo haga visible, para que nos avise la próxima vez que una migración cambie el esquema sin querer.

Los 2 cambios que afectan al proyecto

El primero es change(). En Laravel 10, modificar una columna en una migración necesitaba doctrine/dbal: Doctrine leía la definición actual de la columna, le aplicaba los cambios y conservaba el resto de sus modificadores. En la lección 5 quitamos doctrine/dbal, porque Laravel 11 modifica las columnas por su cuenta, y lo hace de otra forma: la columna queda exactamente como la describe la migración, y cualquier modificador que no se repita se pierde. Lo dice así la guía oficial (se abre en una pestaña nueva): hay que incluir explícitamente todos los modificadores que queramos conservar, aunque los añadiera una migración anterior.

Nuestro proyecto tiene ese caso. La migración create_tickets_table crea la columna priority con default('normal'), y meses después make_priority_nullable_on_tickets_table la hace opcional con ->nullable()->change(), para poder guardar tickets sin clasificar, como los que abre el webhook del correo, sin repetir el default.

El segundo es float(). En Laravel 10, float('estimated_hours', 8, 2) recibía el total de dígitos y los decimales. En Laravel 11, float() solo admite la precisión, que decide si la columna se guarda en 4 o en 8 bytes, y para un número con un total de dígitos y unos decimales fijos está decimal().

Vamos a ver cómo están ahora esas 2 columnas en la base de datos de desarrollo, que creamos en la lección 1 con Laravel 10:

Terminal
sail artisan db:table tickets
Salida
tickets .................................................................... Columns ................................................................. 11 Size .............................................................. 32.00 KB Engine .............................................................. InnoDB Collation ............................................... utf8mb4_unicode_ci Column ................................................................ Type id char, utf8mb4_unicode_ci ....................................... char(36) user_id bigint ............................................. bigint unsigned subject varchar, utf8mb4_unicode_ci ........................... varchar(255) body text, utf8mb4_unicode_ci ......................................... text status varchar, utf8mb4_unicode_ci ....................... open varchar(255) priority varchar, nullable, utf8mb4_unicode_ci ......... normal varchar(255) estimated_hours double, nullable ............................... double(8,2) due_at timestamp, nullable ....................................... timestamp closed_at timestamp, nullable .................................... timestamp created_at timestamp, nullable ................................... timestamp updated_at timestamp, nullable ................................... timestamp ...

priority es opcional y tiene normal como valor por defecto, y estimated_hours es un double(8,2). Es lo que crearon las migraciones con Laravel 10, y es lo que tiene la base de datos de producción. Actualizar a Laravel 11 no cambia ni una columna de una base de datos que ya existe, porque esas migraciones ya se ejecutaron y no se vuelven a ejecutar. El problema aparece, como con la migración de Spatie en la lección 6, en cualquier base de datos que se cree desde cero a partir de ahora.

Lo que queda de esta lección
  1. 02Un test para el esquema de tickets
  2. 03"Failed asserting that null is identical to 'normal'."
  3. 04"Blueprint::float() invoked with 3 parameters, 1-2 required"
  4. 05Producción, las migraciones ya ejecutadas y schema:dump
Sigue leyendo con tu suscripción El curso completo, con el certificado y el foro, está incluido en la suscripción. Ver los planes