Laravel, come utilizzare le migrazioni

Le migrazioni sono come il controllo della versione del database.

Pubblicato da ,
Ultima modifica

In questo articolo vedremo come utilizzare alcune delle funzionalità delle migrazioni del framework laravel 10, in particolare

 
#Configurare una connessione al database

Per configurare la connessione al nostro database modifichiamo il file config\database.php inserendo i nostri dati, la connessione di default è mysql, modifichiamo i valori database, username, password con quelli della nostra connessione al database, ad esempio nel mio caso

<?php

/** config\database.php */

........................
........................
........................

return [
    "default" => env("DB_CONNECTION", "mysql"),

    "mysql" => [
        "driver" => "mysql",
        "url" => env("DATABASE_URL"),
        "host" => env("DB_HOST", "127.0.0.1"),
        "port" => env("DB_PORT", "3306"),
        "database" => env("DB_DATABASE", "laravel"),
        "username" => env("DB_USERNAME", "root"),
        "password" => env("DB_PASSWORD", ""),
        "unix_socket" => env("DB_SOCKET", ""),
        "charset" => "utf8mb4",
        "collation" => "utf8mb4_unicode_ci",
        "prefix" => "",
        "prefix_indexes" => true,
        "strict" => true,
        "engine" => null,
        "options" => extension_loaded("pdo_mysql")
            ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env("MYSQL_ATTR_SSL_CA"),
            ])
            : [],
    ],
];

laravel è il nome del database, root è l'utente e password nessuna poichè sto lavorando in modalità sviluppo.

 
#Generare il database tramite il comando artisan

Nell'applicazione di default di laravel 10 sono già incluse delle migrazioni nella cartella database\migrations

  • 2014_10_12_000000_create_users_table.php
  • 2014_10_12_100000_create_password_reset_tokens_table.php
  • 2019_08_19_000000_create_failed_jobs_table.php
  • 2019_12_14_000001_create_personal_access_tokens_table.php

ad esempio la migrazione create_users_table è simile a questa

<?php

/** 2014_10_12_000000_create_users_table.php */

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

return new class extends Migration {
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create("users", function (Blueprint $table) {
            $table->id();
            $table->string("name");
            $table->string("email")->unique();
            $table->timestamp("email_verified_at")->nullable();
            $table->string("password");
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists("users");
    }
};

in questo file sono definite le colonne della tabella users, che sono id, name, email, email_verified_at, password, remember_token, in particolare

  • $table->timestamps();

genera le colonne created_at e updated_at.

Adesso da CLI lanciamo il comando

$ php artisan migrate

verranno generate nel nostro database le tabelle users, password_reset_tokens, failed_jobs, personal_access_tokens e la tabella migrations dove vengono memorizzate tutte le migrazioni.

Per annullare l'ultima operazione di migrazione si usa il comando

$ php artisan migrate:rollback

è anche possibile specificare il numero delle ultime migrazioni da annullare, ad esempio

$ php artisan migrate:rollback --step=4

annulla le ultime 4 migrazioni.

 
#Creare una nuova migrazione

Per generare una nuova migrazione si usa il comando make:migration, ad esempio se vogliamo generare una migrazione per una tabella denominata flights si usa il seguente comando

$ php artisan make:migration create_flights_table

questo comando genera una migrazione simile a questa

<?php

/** 2024_03_09_000000_create_flights_table.php */

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

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

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists("flights");
    }
};

cioè è lo schema di una tabella flights con le colonne id, created_at e updated_at, se lanciamo di nuovo il comando migrate

$ php artisan migrate

   INFO  Running migrations.

  2024_03_09_000000_create_flights_table ............... 23ms DONE

verrà generata la nuova tabella flights.

 

#Effettuare l'update dello schema di una determinata tabella

Vediamo adesso come apportare aggiornamenti ad una specifica tabella, ad esempio vogliamo aggiungere alla tabella users la colonna phonenumber, quindi creiamo una nuova migrazione tramite il seguente comando specificando il nome della tabella (--table=users)

$ php artisan make:migration add_phone_number_to_users_table --table=users

questo genera una nuova migrazione nella cartella database\migrations simile a questa

<?php

/** 2024_03_09_130938_add_phone_number_to_users_table.php */

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

return new class extends Migration {
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table("users", function (Blueprint $table) {
            //
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table("users", function (Blueprint $table) {
            //
        });
    }
};

modifichiamo questo file in modo che venga aggiunta la colonna phonenumber alla tabella users

<?php

/** 2024_03_09_130938_add_phone_number_to_users_table.php */
........................
........................
........................

return new class extends Migration
{

    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('phonenumber')->after('name');
        });
    }


    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('phonenumber');
        });
    }
};

se adesso lanciamo il comando migrate verrà aggiunata la nuova colonna phonenumber dopo la colonna name ( ->after('name')) alla tabella users

$ php artisan migrate

   INFO  Running migrations.

  2024_03_09_130938_add_phone_number_to_users_table ............... 38ms DONE

 

#Generare il file sql del database

Infine per generare il file sql dell'intero database bisogna usare il seguente comando

$ php artisan schema:dump

questo genera un file mysql-schema.sql nella cartella database\schema, per quanto riguarda questo comando per eliminare tutte le migrazioni esistenti qual'ora ne fossero diventate troppe, si usa il comando

$ php artisan schema:dump --prune