Problem
Dodawanie nowych kolumn do migracji Laravel to powszechna rzecz. Aplikacje mają być skalowalne, co oznacza, że dodawanie nowych funkcji dodatkowo rozwija Twoją aplikację.
Bardzo często nowi programiści Laravela muszą uruchamiać swoje migracje, ale nie upewniają się, że migracje mogą cofać się i migrować wiele razy bez zerwania czegokolwiek.
Chociaż nie na tym się skupiamy, myślę, że ważne było, aby to stwierdzić, zanim wpadniemy w nasz problem.
Oto typowy problem, który nowi programiści Laravela będą próbowali zrobić, gdy chcą dodaćnowąkolumnę do istniejącej tabeli.
Więc w tym momencie zrobili już coś takiego:
funkcja publiczna w górę()Schema::create('organizacje', function ($table)
$table->przyrosty('id');
$table->string('name')->nullable();
$table->text('about')->nullable();
);
Stworzy to dla nich nową tabelę. Aby to było czyste, powinieneś również dodać funkcję down i po prostu upuścić cały stół w tym przypadku. Funkcja down zostanie uruchomiona, gdy będziesz chciał wycofać migrację.
Przeskakując przez to wszystko, prawdziwy problem pojawia się, gdy zapominają o jednej kolumnie i chcą ją później dodać, więc tworzą nowy plik migracji (klasa), próbują uruchomić coś takiego:
funkcja publiczna w górę()Schema::create('organizacje', function ($table)
$table->integer('rozmiar')->nullable();
);
Mają nadzieję na dodanie nowego rozmiaru kolumny do istniejącej tabeli.
Zobaczmy teraz, co się stanie i jak temu zapobiec.
Rozwiązanie
Głównym problemem jest to, co nowi programiści często nie zauważają, czyli statyczna nazwa metody schematu . Używasz tworzenia tylko wtedy, gdy początkowo tworzysz swoją tabelę. Jeśli w dowolnym momencie musisz dalej aktualizować swój stół, zamiast tego chcesz użyć tabeli.
Tak więc prawdziwa funkcja up powinna wyglądać tak:
funkcja publiczna w górę()Schema::table('organizacje', function ($table)
$table->integer('rozmiar')->nullable();
);
A funkcja down wyglądałaby tak:
funkcja publiczna wyłączona()Schema::table('organizacje', function($table)
$table->dropColumn('rozmiar');
);
Moja osobista sugestia jest taka, że po utworzeniu nowego (zmieniającego) pliku migracji wykonaj następujące czynności:
- Uruchom migrację
- Sprawdź, czy kolumna została dodana do tabeli
- Wycofaj migrację, uruchamiając php artisan migrate:rollback
- Upewnij się, że nic się nie dzieje
- Powtórz kroki 2 i 3 ponownie, aby upewnić się, że możesz zamknąć pełny krąg migracji
nie
Kolejna wskazówka
Przyda się to na późniejszym etapie, jeśli chcesz zautomatyzować wdrożenie, a skrypt musi uruchomić wycofywanie zmian.
Kolejną wskazówką, którą mogę ci dać, jest zaplanowanie miejsca, w którym chcesz umieścić swoją kolumnę. Robiąc to, Laravel umieści twoją nową kolumnę na końcu, prawdopodobnie po kolumnie updated_at. (Większość stołów ma to)
Następnie chcesz użyć metody, aby Twój ostateczny kod wyglądał tak:
funkcja publiczna w górę()Schema::table('organizacje', function ($table)
$table->integer('size')->after('name')->nullable();
);
W takim przypadku Laravel umieści twoją nową kolumnę zaraz po kolumnie z nazwą, aby wyglądała ładniej i była o wiele lepiej zorganizowana.