Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Eloquent e Migration in Laravel

Analizziamo il ruolo delle migration in Eloquent, gli strumenti per il versionamento del database in un'applicazione basata su Laravel.
Analizziamo il ruolo delle migration in Eloquent, gli strumenti per il versionamento del database in un'applicazione basata su Laravel.
Link copiato negli appunti

L'ultima parte di questa trattazione dedicata ad Eloquent, il motore di ORM presente in Laravel, riguarderà le migration e i seeder, due strumenti per la gestione del database e dei dati tramite il framework. Nonostante la loro semplicità, si tratta di strumenti di vitale importanza nella definizione del database (migration) e di test (seeder).

Migration

Le migration rappresentano lo strumento per il versioning del database della nostra applicazione. Quando si lavora in team esistono diversi strumenti per il controllo delle versioni del codice, ma nessuno si occupa delle versioni del database: le migration servono proprio a questo.

Ciascun file rappresenterà un'operazione da eseguire sul database applicativo. Questi file saranno ordinati e sarà possibile gestirli tramite appositi comandi come una vera e propria history, muovendosi in avanti e indietro tra le diverse versioni.

Le migration verranno ospitate nella cartella database/migrations all'interno della nostra applicazione. Per creare un nuovo file esiste un apposito comando da terminale: php artisan make:migration nome_migration.

Ciascuna migration è a tutti gli effetti una classe PHP che estende la super classe Illuminate\Database\Migrations\Migration. La classe presenta due soli metodi: up e down.

Questi ultimi rappresentano rispettivamente il comando che si occuperà di creare nuove tabelle o colonne e il comando per annullare queste modifiche. Sarà compito del framework invocare il metodo up quando si vorrà aggiornare il database all'ultima versione e down in caso di revert delle modifiche.

Una volta definita la nostra migration, la potremo attivare tramite comandi da terminale:

Comando Descrizione
php artisan migrate Permetterà aggiornare il database all'ultima versione delle migration.
php artisan migrate:rollback Consentirà di tornare indietro di un gruppo di versioni.
php artisan migrate:reset Istruzione con cui sarà possibile tornare indietro alla prima versione.

Creazione di nuove tabelle

Per creare una nuova tabella possiamo invocare il metodo create sulla facade Schema passando come parametro una callback che permette di definire le colonne della nuova tabella.

Schema::create('my_first_table', function (Blueprint $table) {
        $table->increments('my_first_id');
    $table->string('my_first_string_column');
});

Esistono diversi metodi per le varie tipologie di colonne. Un elenco esaustivo è disponibile nella documentazione ufficiale.

Per rinominare una tabella utilizziamo:

Schema::rename('my_first_table', 'my_first_renamed_table');

Invece, per eliminarne una sarà possibile ricorrere a:

Schema::drop('my_first_table');

Creazione di nuove colonne

Per creare nuove colonne possiamo utilizzare un metodo simile a create: table.

Schema::table('my_first_table', function ($table) {
    $table->integer('my_first_integer_column');
});

Le colonne possono presentare anche dei modificatori, utili a meglio descrivere la struttura dei dati. Per esempio per definire una colonna come nullable scriviamo:

Schema::table('my_first_table', function ($table) {
    $table->integer('my_first_nullable_column')->nullable();
});

Eventuali altri modificatori sono first, after (per definire la posizione della colonna nella tabella), default (per impostare un valore di default) e unsigned (per impostare la colonna numerica come unsigned).

Per modificare o rinominare colonne già esistenti possiamo utilizzare:

Schema::table('my_first_table', function ($table) {
    $table->string('my_first_string_column', 50)->nullable()->change(); //imposto la lunghezza a 50 e la rendo nullable
});
Schema::table('my_first_table', function ($table) {
    $table->renameColumn('my_first_string_column', 'my_first_renamed_string_column');
});

Questi ultimi comandi, dato che richiedono query SQL non banali per essere eseguite, necessitano della presenza di un modulo addizionale di Laravel installabile tramite composer: doctrine/dbal.

Per eliminare una colonna si ricorrerà invece a:

Schema::table('my_first_table', function ($table) {
    $table->dropColumn('my_first_dropped_column');
});

Indici e chiavi esterne

Grazie alle migration è anche possibile definire aspetti più avanzati come indici e chiavi esterne.

Per quanto riguarda gli indici abbiamo a disposizione diversi modificatori: unique (per creare un indice unique), primary (per impostare una chiave primaria) e index (per creare un indice standard).

Le chiavi esterne invece possono essere create con:

$table->foreign('external_table_id')
        ->references('id')->on('external_table')
        ->onDelete('cascade');

Ti consigliamo anche