Problema
L'aggiunta di nuove colonne alle migrazioni di Laravel è una cosa comune. Le applicazioni sono pensate per essere scalabili, il che significa che l'aggiunta di nuove funzionalità sviluppa ulteriormente la tua applicazione.
Molto spesso, i nuovi sviluppatori di Laravel devono eseguire le loro migrazioni ma non si assicurano che le migrazioni possano eseguire il rollback e migrare più volte senza interrompere nulla.
Anche se questo non è il nostro obiettivo, penso che fosse importante affermarlo prima di affrontare il nostro problema.
Quello che segue è un problema comune che i nuovi sviluppatori di Laravel cercheranno di fare quando vogliono aggiungere una nuova colonna a una tabella esistente.
Quindi a questo punto hanno già fatto qualcosa del tipo:
funzione pubblica su()Schema::create('organizzazioni', funzione ($tabella)
$table->increments('id');
$table->string('name')->nullable();
$table->text('about')->nullable();
);
Questo creerà una nuova tabella per loro. E per renderlo pulito, dovresti anche aggiungere la funzione giù e rilasciare l'intera tabella in questo caso. La funzione down verrà eseguita quando si desidera eseguire il rollback della migrazione.
Passando attraverso tutto ciò, il vero problema si presenta quando dimenticano una colonna e vogliono aggiungerla in seguito, quindi creano un nuovo file di migrazione (classe) e provano a eseguire qualcosa del tipo:
funzione pubblica su()Schema::create('organizzazioni', funzione ($tabella)
$table->integer('size')->nullable();
);
Sperano di aggiungere una nuova dimensione di colonna alla tabella esistente.
Ora vediamo cosa succede e come evitare che accada di nuovo.
Soluzione
Il problema principale qui è ciò che i nuovi sviluppatori spesso tendono a non notare quale è il nome del metodo statico dello schema . Usi create solo quando crei inizialmente la tua tabella. Se hai bisogno di aggiornare ulteriormente la tua tabella in qualsiasi momento, desideri utilizzare invece la tabella.
Quindi la funzione real up dovrebbe essere così:
funzione pubblica su()Schema::table('organizations', function ($table)
$table->integer('size')->nullable();
);
E la funzione down sarebbe così:
funzione pubblica giù()Schema::table('organizations', function($table)
$table->dropColumn('size');
);
Il mio consiglio personale per te è che dopo aver creato il tuo nuovo file di migrazione (modificato), procedi come segue:
- Esegui la migrazione
- Controlla se la colonna è stata aggiunta alla tabella
- Eseguire il rollback della migrazione eseguendo php craft migrate:rollback
- Assicurati che non succeda nulla
- Ripeti nuovamente i passaggi 2 e 3 per assicurarti di poter chiudere il cerchio completo della migrazione
n
Un altro consiglio
Questo sarà utile in una fase successiva se vuoi automatizzare la tua distribuzione e il tuo script deve eseguire un rollback.
Un altro consiglio che posso darti è quello di pianificare dove vuoi posizionare la tua colonna. Solo così facendo, Laravel posizionerà la tua nuova colonna alla fine, probabilmente dopo la colonna update_at. (La maggior parte dei tavoli ha questo)
Vuoi usare un metodo dopo in modo che il tuo codice finale assomigli a questo:
funzione pubblica su()Schema::table('organizations', function ($table)
$table->integer('size')->after('name')->nullable();
);
In questo caso, Laravel posizionerà la tua nuova colonna subito dopo la colonna del nome in modo che abbia un bell'aspetto e sia organizzata molto meglio.