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');