0

Tengo la siguiente situación:

  • Una migración que crea una tabla
  • Migraciones posteriores que modifican su estructura
  • Un Seeder que guarda datos en esa tabla
  • Migraciones que invocan ese seeder

Y quiero:

  • Agregar dos columnas nuevas
  • Ponerle datos a las dos columnas nuevas
  • Ponerle datos a una columna que ya existía, pero no tenía datos.

La duda que tengo es con los últimos dos puntos, debo crear un Seeder que sea UpdateTableSeeder y luego crear una migración para que invoque dicho Seeder (nunca había visto esto antes, me suena a mala práctica). El problema es que he intentado modificar el seeder original, pero me falla porque las migraciones que invocan ese seeder lo hacen ANTES de que mis nuevas migraciones creen los nuevos campos. O seria mejor crear una migración para rellenar esos datos faltantes? migraciones creen los nuevos campos. O seria mejor crear una migración para rellenar esos datos faltantes?

1
  • Buen día, si la base de datos ya está en producción y ya tiene datos entonces debes crear una nueva migración para agregar las dos columnas y un nuevo seeder para agregar los datos o podrías agregar una función a tu modelo o crear un comando de artisan para agregar los datos a las columnas nuevas. Commented el 27 jun. 2023 a las 7:20

1 respuesta 1

0

si los datos no son de valor (da igual perderlos) podrías ir a lo simple y hacer un refresh:

php artisan migrate:refresh (OJO esto ELIMINA TODOS LOS DATOS, no lo uses si no es tú caso)

Para cambiar las estructuras de tablas (con migraciones) es necesario que tengas instalado el siguiente paquete de composer:

composer require doctrine/dbal

Te pongo un ejemplo sin perder datos de una migración de usuarios:

public function up()
{
      Schema::create('usuarios', function (Blueprint $table) {
             $table->id();
             $table->string('nombre',80);
             $table->string('email',80);
             $table->string('sexo',5); 
             $table->boolean('activo');
             $table->timestamps();
      });
}

public function down(): void
{
    Schema::drop('usuarios');
}

Tras esto ejecutarias tu seeder o en tu caso usaría la app y los datos se guardarían. Y llega el caso que mencionas, quieres cambiar la tabla.

Si no quieres perder información debes crear una nueva migración:

php artisan make:migration actualizar_y_aniadir_estado_tabla_usuario

En el método up() de la migración podrás modificar lo que quieras:

public function up()
{
       Schema::table('usuarios', function (Blueprint $table) {
               $table->renameColumn('nombre', 'alias');// Renombra  "nombre" a "alias"
               $table->string('sexo',10)->change(); // Cambia la longitud del string en la DB
               $table->dropColumn('activo'); // Elimina la columna "activo"
               $table->smallInteger('estado')->after('email'); // Añade la columna "estado" despues de email
       });
}

Recuerda que aquí el down() debe revertir todo lo que hiciste:

public function down()
{
        Schema::table('usuarios', function (Blueprint $table) {
               $table->renameColumn('alias', 'nombre');
               $table->string('sexo')->change(); 
               $table->smallInteger('activo');
               $table->dropColumn('estado');
        });
}

Tras esto puedes usar los seeder como gustes siguiendo la documentación de laravel (link aquí).

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.