Problem
Att lägga till nya kolumner i dina Laravel-migreringar är en vanlig sak. Applikationer är avsedda att vara skalbara, vilket innebär att du lägger till nya funktioner utvecklar din applikation ytterligare.
Mycket ofta behöver nya Laravel-utvecklare köra sina migreringar men de ser inte till att migreringar kan återställas och migrera flera gånger utan att bryta någonting.
Även om det inte är vårt fokus, tycker jag att det var viktigt att säga det innan vi går in i vårt problem.
Följande är ett vanligt problem som nya Laravel-utvecklare kommer att försöka göra när de vill lägga till en ny kolumn i en befintlig tabell.
Så vid den här tiden gjorde de redan något som:
offentlig funktion upp ()Schema :: skapa ('organisationer', funktion ($ tabell)
$ tabell-> steg ('id');
$ table-> string ('name') -> nullable ();
$ table-> text ('about') -> nullable ();
);
Detta skapar en ny tabell för dem. Och för att göra detta rent bör du också lägga till nerfunktionen och bara släppa hela bordet i det här fallet. Nerfunktionen körs när du vill återställa din migrering.
Hoppar igenom allt detta visas det verkliga problemet när de glömmer en kolumn och de vill lägga till det efteråt så att de skapar en ny migreringsfil (klass) försöker köra något som:
offentlig funktion upp ()Schema :: skapa ('organisationer', funktion ($ tabell)
$ table-> heltal ('storlek') -> ogiltigt ();
);
De hoppas kunna lägga till en ny kolumnstorlek i den befintliga tabellen.
Låt oss nu se vad som händer och hur man kan förhindra att det händer igen.
Lösning
Det största problemet här är vad nya utvecklare ofta missar att märka vilket är det statiska metodnamnet för schemat . Du använder bara create när du först skapar din tabell. Om du behöver uppdatera din tabell när som helst vill du istället använda tabellen.
Så den verkliga upp-funktionen bör vara så här:
offentlig funktion upp ()Schema :: tabell ('organisationer', funktion ($ tabell)
$ table-> heltal ('storlek') -> ogiltigt ();
);
Och nerfunktionen skulle vara så här:
offentlig funktion ner ()Schema :: tabell ('organisationer', funktion ($ tabell)
$ table-> dropColumn ('storlek');
);
Mitt personliga förslag till dig är att när du har skapat din nya (ändrade) migreringsfil gör du följande:
- Kör migreringen
- Kontrollera om kolumnen har lagts till i tabellen
- Återställ migrering genom att köra php artisan migrate: rollback
- Se till att ingenting händer
- Upprepa steg 2 och 3 igen för att se till att du kan stänga hela cirkeln av migratio
n
Ett annat tips
Detta kommer att vara användbart i ett senare skede om du vill automatisera din distribution och ditt skript måste köra en återställning.
Ett annat tips som jag kan ge dig är att planera var du vill placera din kolumn. Bara genom att göra detta kommer Laravel att placera din nya kolumn i slutet, troligen efter kolumnen updated_at. (De flesta bord har detta)
Du vill använda en metod efter så att din slutliga kod ser ut så här:
offentlig funktion upp ()Schema :: tabell ('organisationer', funktion ($ tabell)
$ table-> heltal ('storlek') -> efter ('namn') -> ogiltigt ();
);
I det här fallet kommer Laravel att placera din nya kolumn direkt efter namnkolumnen så att den ser bra ut och är organiserad mycket bättre.