El equipo de desarrollo de Laravel saco una nueva actualización con soporte a las migraciones anónimas. Si te preguntas de que se tratan estas migraciones anónimas, no son nada mas ni nada menos que clases anónimas en PHP. Utilizando estas clases anónimas solucionamos el problema de migraciones con nombres de clases duplicados al instalar una base de datos desde cero.

En Laravel 8.37, el framework ahora permite trabajar con clases anónimas. Te dejo un ejemplo que se demostró en las pruebas de esta nueva versión:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('people', function (Blueprint $table) {
            $table->string('first_name')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('people', function (Blueprint $table) {
            $table->dropColumn('first_name');
        });
    }
};

De esta manera retornando una nueva clase anónima, las migraciones se benefician un montón en esta nueva versión. Lo mejor de esta nueva actualización es que funciona con todas las variantes de Laravel 8 que salieron anteriormente.

Si querés empezar a utilizar las migraciones anonimias en tu proyecto de manera independiente con todas las migraciones, podes modificar los stubs en tu aplicación, ya que por defecto no vienen incluidas en esta versión. Es probable que esta actualización la esperemos completa para Laravel 9.

Para publicar los stubs en nuestra aplicación, ejecutamos el siguiente comando de artisan:

php artisan stub:publish

Ahora tendremos la carpeta stubs dentro de nuestro proyecto. Modificamos el archivo de creación de migraciones para que acepten las migraciones anónimas, agregándole un punto y coma (;) al final de la clase y reemplazando el nombre de la clase por return new class como se muestra en el siguiente ejemplo:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('{{ table }}', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('{{ table }}');
    }
};

Lo mismo debemos realizar con los 3 stubs de migraciones correspondiente. De esta manera podremos crear dos migraciones con el mismo nombre, pero diferente timestamp y nuestra aplicación de Laravel 8 va a interpretar las clases anónimas como diferentes clases y ejecutarlas a ambas por igual sin colisión.

Copyright © 2018-2020 Latirus. Todos los Derechos Reservados.