I segreti del comando make:migration cover image

I segreti del comando make:migration

Alberto Peripolli • 25 agosto 2022


Una delle operazioni più comuni in Laravel è la creazione delle migrazioni, esse ci consentono semplicemente di cambiare stato al nostro database.
Il metodo più consono per creare una nuova migrazione è attraverso relativo comando artisan make, al quale la documentazione ufficiale limita un solo paragrafo, pochi però sanno che nascosti nel comando base ci sono molti trucchetti che possono semplificare e velocizzare queste operazioni.

Il comando artisan esposto nella documentazione è il seguente:

php artisan make:migration create_flights_table

La guida dice che esso cercherà nel nome passato i riferimenti alla tabella e se si tratta di una creazione, ma non spiega il come.

Per questo ho creato questa semplice guida che riepiloga tutti i trucchi.

1. Passare il nome senza usare i _

Nell'esempio sopra riportato il nome del file è scritto con tutti i trattini bassi che dividono le parole, ma non è molto pratico da scrivere.
Per fortuna è possibile passare il nome dentro a degli apici "" utilizzando così i più comodi spazi:

php artisan make:migration "create flights table"

2. Creare una nuova tabella

Per creare una nuova tabella dobbiamo far capire al comando che si tratta di una creazione e il nome della tabella.
Possiamo quindi usare un nome specifico per la migrazione o passare opzioni aggiuntive –create[=CREATE] e/o –table[=TABLE]. Il comando tenterà di scoprire tali informazioni dal nome tramite un componente chiamato TableGuesser.

# utilizzando semplicemente il TableGuesser
php artisan make:migration "create users table"

# con i parametri --table e --create
php artisan make:migration "My migration" --table=users --create

# oppure più semplicemente
php artisan make:migration "My migration" --create=users

Per far capire al TableGuesser che vogliamo creare una nuova tabella basta mettere nel nome "create nome_tabella table" oppure solamente "create nome_tabella".

Una volta lanciato il comando verrà creata una nuova migration con il nome date_time_[nome_della_migrazione].php con precompilato il codice per la creazione della tabella:

public function up()
{
    Schema::create('my_table', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
    });
}

public function down()
{
    Schema::dropIfExists('my_table');
}

3. Modificare una tabella esistente

Similmente al comando per creare la tabella anche per modificare una tabella esistente abbiamo due modi per farlo capire il nome della tabella. Anche in questo caso possiamo utilizzare un nome interpretabile dal TableGuesser o specificarlo con l'opzione --table[=TABLE].

# utilizzando semplicemente il TableGuesser
php artisan make:migration "add field to users"
php artisan make:migration remove_field_from_users_table

# con l'opzione --table
php artisan make:migration "My migration" --table=my_table

Per far capire al TableGuesser il nome della tabella ci basta scriverlo alla fine del nome e anteporlo alle preposizioni to, from o in.

Una volta lanciato il comando verrà creata una nuova migration con il nome date_time_[nome_della_migrazione].php con precompilato il codice per la modifica della tabella:

public function up()
{
    Schema::table('my_table', function (Blueprint $table) {
        //
    });
}

public function down()
{
    Schema::table('my_table', function (Blueprint $table) {
        //
    });
}

4. Personalizzazione dei path

Di default tutte le migrazioni verranno create nella cartella database/migrations, ma in molti casi (ad esempio nella DDD) potremmo essere interessati a cambiare questo percorso.

Per far questo possiamo usare l'opzione --path[=PATH], nella quale definiamo il percorso alternativo dove creare la migrazione.
Inoltre se aggiungiamo l'opzione --realpath il path passato al comando sarà un path assoluto (utilizzando il path base di Laravel).

php artisan make:migration my_migration --path=test/folder
# Crea la migrazione in ./test/folder/date_time_my_migration.php

php artisan make:migration my_migration --path=test/folder
# Crea la migrazione in /var/www/laravel-project/test/folder/date_time_my_migration.php se laravel è nella cartella /var/www/laravel-project

Per completezza segnalo anche che se viene passata l'opzione --fullpath nel messaggio del comando artisan verrà aggiunto il path al nome.

 INFO  Created migration [test/folder/2022_08_31_085751_my_migration.php]. 

5. Personalizzazione degli stub

Molte volte il codice di base che ci propone Laravel ci va un po' stretto... per fortuna possiamo personalizzarlo semplicemente.

Ci basta lanciare il comando artisan:

php artisan stub:publish

e verranno pubblicati nella cartella stubs nella root del progetto tutte le basi di partenza per la creazione di file dai comandi make di Laravel artisan. Una volta modificati verranno utilizzate queste nuove versioni dai comandi.

I file interessanti per le migrazioni sono:

  • migration.stub file vuoto:utilizzato quando il comando con capisce la tabella
  • migration.create.stub file per la creazione di una tabella
  • migration.update.stub file per la modifica di una tabella

TIP: Se siete a corto di idee potete utilizzare il pacchetto di spatie spatie/laravel-stubs, che contiene le personalizzazioni opinionate degli stub di Laravel. In questo caso ad esempio hanno completamente rimosso le funzioni di rollback delle migrazioni.

6. Creazione del modello insieme alla migrazione

Nel caso volessimo creare anche un nuovo Model insieme alla migrazione, possiamo ricorrere al comando artisan make:model.

Questo comando crea un nuovo Model ma passando l'opzione -m o --migration crea anche la migrazione di creazione tabella.

php artisan make:model Flight --migration
# questo comando creerà il model in app/Models/Flight.php 
# ed anche la migrazione in database/migrations/date_time_create_flights_table.php

Commenti e valutazioni