Dodaj nową kolumnę do istniejącej tabeli podczas migracji


270

Nie mogę wymyślić, jak dodać nową kolumnę do mojej istniejącej tabeli bazy danych przy użyciu środowiska Laravel.

Próbowałem edytować plik migracji za pomocą ...

<?php

public function up()
{
    Schema::create('users', function ($table) {
        $table->integer("paid");
    });
}

W terminalu wykonuję php artisan migrate:installi migrate.

Jak dodać nowe kolumny?


Byłoby użyteczne, gdybyś mógł dołączyć wszelkie otrzymywane błędy; czego się spodziewasz; a co się właściwie dzieje?
Phill Sparks

9
Świetne pytanie. Istnieje wiele dokumentacji migracji, która pokazuje API i jak tworzyć tabele PIERWSZY CZAS. To wszystko kończy się niepowodzeniem, gdy bardziej rozwijasz swoją aplikację i musisz zmodyfikować strukturę db.
Andrew Koper,

Odpowiedzi:


609

Aby utworzyć migrację, możesz użyć polecenia migrate: make w interfejsie CLI Artisan. Użyj konkretnej nazwy, aby uniknąć kolizji z istniejącymi modelami

dla Laravel 3:

php artisan migrate:make add_paid_to_users

dla Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

Następnie musisz użyć tej Schema::table()metody (podczas uzyskiwania dostępu do istniejącej tabeli, a nie tworzenia nowej). Możesz dodać taką kolumnę:

public function up()
{
    Schema::table('users', function($table) {
        $table->integer('paid');
    });
}

i nie zapomnij dodać opcji wycofania:

public function down()
{
    Schema::table('users', function($table) {
        $table->dropColumn('paid');
    });
}

Następnie możesz uruchomić migracje:

php artisan migrate

Wszystko to jest dobrze opisane w dokumentacji zarówno Laravela 3:

A dla Laravel 4 / Laravel 5:

Edytować:

użyj, $table->integer('paid')->after('whichever_column');aby dodać to pole po określonej kolumnie.


3
Po prostuphp artisan migrate
Phill Sparks

Coś jest nie tak. Wykonuję „db: make”, aby utworzyć nowy plik migracji. A potem wstawiam Schema :: table ('users', function ($ table) {$ table-> integer ('paid');}); w tym. I uruchom „php artisan migrate”, ale pojawia się błąd krytyczny: nie można ponownie ustawić klasy użytkowników w /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php w linii 3
kim larsen

Tworzenie migracji jest również omówione w dokumentacji. Powinieneś nadać mu bardziej szczegółową nazwę, na przykład „add_paid_to_users”, w ten sposób nie będzie kolidował z kolizją twojego modelu.
Phill Sparks

Wygląda na to, że każdy adres URL dokumentu Laravel 3 przekierowuje do dokumentów Laravel 4. Oto linki do 3 dokumentu dotyczącego narzędzia do tworzenia schematów i migracji

6
Począwszy od Laravela 5, polecenie to php artisan make:migration add_paid_to_users
brzmiałoby

64

Dodam do odpowiedzi mike3875 dla przyszłych czytelników używających Laravel 5.1 i nowszych.

Aby przyspieszyć, możesz użyć flagi „--table” w następujący sposób:

php artisan make:migration add_paid_to_users --table="users"

Spowoduje to automatyczne dodanie treści upi downmetody:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        //
    });
}

Podobnie możesz użyć tej --create["table_name"]opcji podczas tworzenia nowych migracji, które dodadzą więcej podstaw do twoich migracji. Mały punkt, ale pomocny, gdy robi się ich mnóstwo!


2
Tak nie było w Laravel 5.0, Blueprintdodano w Laravel 5.1. Tylko kwestia wyjaśnienia jest wszystkim.
Phill Sparks

@PhillSparks Masz rację, dziękuję za złapanie mojego błędu. Zaktualizowałem, aby wyjaśnić wersję, w której można tego użyć.
camelCase

24

Jeśli używasz Laravela 5, polecenie brzmiałoby;

php artisan make:migration add_paid_to_users

Wszystkie polecenia tworzenia rzeczy (kontrolery, modele, migracje itp.) Zostały przeniesione pod make:polecenie.

php artisan migrate jest wciąż taki sam.


24

laravel 5.6 i wyżej

w przypadku, gdy chcesz dodać nową kolumnę jako KLUCZ ZAGRANICZNY do istniejącej tabeli.

Utwórz nową migrację, wykonując to polecenie: make :igration

Przykład:

php artisan make:migration add_store_id_to_users_table --table=users

W folderze bazy danych / migracji masz nowy plik migracji, na przykład:

2018_08_08_093431_add_store_id_to_users_table.php (zobacz komentarze)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddStoreIdToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Create new column
            // You probably want to make the new column nullable
            $table->integer('store_id')->unsigned()->nullable()->after('password');

            // 2. Create foreign key constraints
            $table->foreign('store_id')->references('id')->on('stores')->onDelete('SET NULL');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Drop foreign key constraints
            $table->dropForeign(['store_id']);

            // 2. Drop the column
            $table->dropColumn('store_id');
        });
    }
}

Następnie uruchom polecenie:

php artisan migrate

Jeśli chcesz cofnąć ostatnią migrację z jakiegokolwiek powodu, uruchom następującą komendę:

php artisan migrate:rollback

Więcej informacji na temat migracji można znaleźć w dokumentach


1
Bardzo wyczerpująca i trafna odpowiedź. Dzięki!
musicin3d

17

Możesz dodać nowe kolumny w ramach Schema::createmetody początkowej , jak to:

Schema::create('users', function($table) {
    $table->integer("paied");
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

Jeśli już utworzyłeś tabelę, możesz dodać do niej dodatkowe kolumny, tworząc nową migrację i używając Schema::tablemetody:

Schema::table('users', function($table) {
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

Dokumentacja jest dość dokładna i nie zmieniła się zbytnio od wersji 3 do wersji 4 .


Coś jest nie tak. Wykonuję „db: make”, aby utworzyć nowy plik migracji. A potem wstawiam Schema :: table ('users', function ($ table) {$ table-> integer ('paid');}); w tym. I uruchom „php artisan migrate”, ale pojawia się błąd krytyczny: nie można ponownie ustawić klasy użytkowników w /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php w linii 3
kim larsen

Powinieneś nadać każdej migracji nazwę unikatową podczas ich tworzenia. Zwykle początkowa tworzyć będę wymienić create_users_table, a następnie, jeśli Dodaję kolumny: add_email_password_columns_to_users.
tplaner

tak, jak mówi ewolucja, na pewno lepiej trzymać się oryginalnych filozofii projektowania lavavel i używać add_czasownika „ ” z przodu każdego pliku, aby śledzić zmiany. w ten sposób łatwiej jest śledzić zmiany kontroli wersji itp., ponieważ dla każdej iteracji tworzony jest nowy plik dodawania. Jeśli po prostu poszedłeś i ciągle modyfikowałeś „ create_”, trudno byłoby wiedzieć, że x pracownik, coś pomieszał, usuwając indeks lub dodając nową kolumnę itp., Przynajmniej to ma sens w mojej głowie! :)
wired00

7

możesz po prostu zmodyfikować istniejący plik migracji, na przykład dodając kolumnę do tabeli, a następnie wpisując w terminalu:

$ php artisan migrate:refresh

11
Odśwież spowoduje opróżnienie stołu
JohnTaa

8
Jest to niezwykle niebezpieczne - jeśli niektórzy ludzie uruchomią starą wersję, inni będą mieli nową i nastąpi chaos. W Liquibase, jeśli edytujesz plik, zakończy się on niepowodzeniem, chyba że jawnie wprowadzisz wyjątki, aby na to pozwolić, i możesz to zrobić tylko w nielicznych przypadkach. Np. Jeśli kolumna zostanie ustawiona na wartość inną niż null, gdy w niektórych bazach danych znajdują się już dane null, ulegnie ona awarii.
John Little

3
Byłoby lepiej, gdybyś edytował swoją odpowiedź i wspomniał, że opróżniłby twój stół, byłoby lepiej.
Abel

Uwaga: to polecenie wyczyści całe tabele baz danych , jeśli chcesz go użyć, a następnie wykonaj kopię zapasową bazy danych
Udhav Sarvaiya

5

to działa na laravel 5.1.

najpierw uruchom na swoim terminalu ten kod

php artisan make:migration add_paid_to_users --table=users

następnie przejdź do katalogu projektu i rozwiń bazę danych katalogu - migruj i edytuj plik add_paid_to_users.php, dodaj ten kod

public function up()
{
    Schema::table('users', function (Blueprint $table) {
         $table->string('paid'); //just add this line
    });
}

potem wróć do terminala i wykonaj to polecenie

php artisan migrate

Mam nadzieję, że to pomoże.


5

Najpierw przywróć poprzednią migrację

php artisan migrate:rollback

Następnie możesz zmodyfikować istniejący plik migracji (dodać nowy, zmienić nazwę lub usunąć kolumny), a następnie ponownie uruchomić plik migracji

php artisan migrate

0

Chociaż plik migracji to najlepsza praktyka, jak wspomnieli inni, w mgnieniu oka można również dodać kolumnę z majstrować.

$ php artisan tinker

Oto przykładowy jeden wiersz dla terminala:

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ $table->integer('paid'); })



(Tutaj jest sformatowany dla czytelności)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.