Jak mogę zmienić nazwę kolumny w programie Laravel za pomocą migracji?


88

Mam kolumny, jak wspomniano poniżej:

public function up()
{
    Schema::create('stnk', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('no_reg', 50)->unique();
        $table->string('no_bpkb', 50)->unique();
        $table->string('nama_pemilik', 100);
        $table->string('alamat');
        $table->string('merk', 50);
        $table->string('tipe', 50);
        $table->string('jenis', 50);
        $table->smallInteger('tahun_pembuatan');
        $table->smallInteger('tahun_registrasi');
        $table->smallInteger('isi_silinder');
        $table->string('no_rangka', 50);
        $table->string('no_mesin', 50);
        $table->string('warna', 50);
        $table->string('bahan_bakar', 50);
        $table->string('warna_tnkb', 50);
        $table->string('kode_lokasi', 50);
        $table->date('berlaku_sampai');
        $table->timestamps();

        $table->index('created_at');
        $table->index('updated_at');
    });

}

Zrobiłem siewnik do stłuczenia stołu

Teraz chcę zmienić nazwę idna id_stnk.
Dodałem „doctrine / dbal” w „composer” i zrobiłem composer update.

Dokonałem migracji php artisan migration:make rename_column.
Następnie dodałem nową metodę do rename_column:

Schema::table('stnk', function(Blueprint $table)
{
    $table->renameColumn('id', 'id_stnk');

});

A potem próbowałem uruchomić polecenie, php artisan migrateale pojawił się błąd, jak wspomniano poniżej:

[Ulluminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1025 Error on rename of './my_database/#sql -447_33' to './my_database/stnk' (error: 150) (SQL: ALTER TABLE stnk CHANGE id id_stnk INT UNSIGENED AUTO_INCREMENT NOT NULL)

[PDOException]
SQLSTATE[HY000]: General error: 1025  Error on rename  of './my_database/#sql -447_33' to './my_database/stnk' (error: 150)

Odpowiedzi:


115

Musisz utworzyć kolejny plik migracji - i umieścić go tam:

Biegać

Laravel 4:    php artisan migrate:make rename_stnk_column
Laravel 5:    php artisan make:migration rename_stnk_column

Następnie w nowym pliku migracji umieść:

class RenameStnkColumn extends Migration
{

    public function up()
    {
        Schema::table('stnk', function(Blueprint $table) {
            $table->renameColumn('id', 'id_stnk');
        });
    }


    public function down()
    {
        Schema::table('stnk', function(Blueprint $table) {
            $table->renameColumn('id_stnk', 'id');
        });
    }

}

wyedytowałem moje pytanie powyżej, spójrz teraz .. mam komunikat o błędzie w gitbash
Ariasa

Błąd 150 to ograniczenie klucza obcego. Oznacza to, że masz inne tabele, które odwołują się do idw stnktabeli.
Laurence,

3
Uwaga dla Laravel 5 jest teraz make:migrationi niemigrate:make
Jason

8
Aby zmiana nazwy kolumny działała, musisz wymagać pakietu, który został usunięty w L5. "doctrine/dbal": "~2.3"Bez tego pojawiają się bardzo niejasne błędy. Został zgłoszony jako błąd tutaj github.com/laravel/framework/issues/3116 i prawdopodobnie mniej przydatna wzmianka w dokumentacji tutaj laravel.com/docs/5.0/schema#renaming-columns
Jason

Czy po zakończeniu migracji plik należy usunąć, a oryginalny schemat tworzenia zaktualizować? Po prostu pytam, jak utrzymać porządek
orbita

27

Pierwszą rzeczą, którą chcesz zrobić, jest utworzenie pliku migracji.

Wpisz swoją linię poleceń

php artisan make:migration rename_stk_column --table="YOUR TABLE" --create

Po utworzeniu pliku. Otwórz nowo utworzony plik migracji w folderze aplikacji w sekcji Baza danych / migracje.

W swojej metodzie up wstaw to:

Schema::table('stnk', function(Blueprint $table)
    {
        $table->renameColumn('id', 'id_stnk');
    });
}

iw swojej metodzie puchu:

    Schema::table('stnk', function(Blueprint $table)
    {
        $table->renameColumn('id_stnk', 'id);
    });
}

następnie w linii poleceń wpisz

php artisan migrate

Wtedy wollah! właśnie zmieniłeś nazwę id na id_stnk. BTW możesz użyć

php artisan migrate:rollback

cofnąć zmiany. Powodzenia


wyedytowałem moje pytanie powyżej, spójrz teraz .. mam komunikat o błędzie w gitbash
Ariasa

1
Pamiętaj, aby dodać zależność doctrine / dbal do pliku composer.json.
Ben

16

Wykonaj następujące kroki, odpowiednio, aby zmienić nazwę pliku migracji kolumn.

1- Czy w Twoim projekcie jest biblioteka Doctrine / dbal? Jeśli nie masz, najpierw uruchom polecenie

composer require doctrine/dbal

2- Utwórz plik migracji aktualizacji do aktualizacji starego pliku migracji. Ostrzeżenie (musisz mieć taką samą nazwę)

php artisan make:migration update_oldFileName_table

na przykład nazwa mojego starego pliku migracji: create_users_table nazwa pliku aktualizacji powinna: update_users_table

3- update_oldNameFile_table.php

Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});

„z” mojej starej nazwy kolumny i „do” mojej nowej nazwy kolumny

4- Na koniec uruchom polecenie migracji

php artisan migrate

Link do źródła: dokument laravel


14

Zmiana nazw kolumn (Laravel 5.x)

Aby zmienić nazwę kolumny, możesz użyć metody renameColumn w Kreatorze schematów. * Przed zmianą nazwy kolumny pamiętaj, aby dodać zależność doctrine / dbal do pliku composer.json. *

Możesz też po prostu zażądać pakietu za pomocą kompozytora ...

composer require doctrine/dbal

Źródło: https://laravel.com/docs/5.0/schema#renaming-columns

Uwaga: użyj make: migracja i nie migrować: make dla Laravel 5.x


Po prostu nie używaj żadnych kolumn jako ENUM w tabeli, którą próbujesz edytować. Doctrine / dbal nie wie co to jest ..... Musiałem zmienić oryginalną migrację na poprawną nazwę przy starcie i zresetować całą bazę danych. Na szczęście wciąż byłem w fazie rozwoju. Chciałbym, żeby Laravel & Co od początku uzależniał to od kompozytora?
mikoop

@mikoop Pierwotnie była zależnością od samego początku, we wcześniejszych wersjach frameworka. Ale ta zależność jest zbyt ciężka i nie jest powszechnie stosowana. Więc został usunięty. (To jest podsumowanie; przed podjęciem decyzji było wiele dyskusji. W rzeczywistości społeczność poprosiła o jej usunięcie i została wysłuchana.)
J. Bruni,

renameColumn został uznany za przestarzały w doktrynie i obecnie usunięty.
Sander Visser,

9

Wrzucam tutaj moje 0,02 dolara, ponieważ żadna z odpowiedzi nie zadziałała, ale skierowała mnie na właściwą ścieżkę. Zdarzyło się, że poprzedni obcy przymus spowodował błąd. Oczywiste, kiedy się nad tym zastanowić.

Dlatego w nowej upmetodzie migracji najpierw usuń pierwotne ograniczenie, zmień nazwę kolumny, a następnie ponownie dodaj ograniczenie z nową nazwą kolumny. W downmetodzie robisz dokładnie odwrotnie, aby powrócić do sprzedanego ustawienia.

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('proxy4s', function (Blueprint $table) {
        // Drop it
        $table->dropForeign(['server_id']);

        // Rename
        $table->renameColumn('server_id', 'linux_server_id');

        // Add it
        $table->foreign('linux_server_id')->references('id')->on('linux_servers');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('proxy4s', function (Blueprint $table) {
        // Drop it
        $table->dropForeign(['linux_server_id']);

        // Rename
        $table->renameColumn('linux_server_id', 'server_id');

        // Add it
        $table->foreign('server_id')->references('id')->on('linux_servers');
    });
}

Mam nadzieję, że to zaoszczędzi komuś trochę czasu w przyszłości!


1

Powyższa odpowiedź jest świetna lub jeśli nie zaszkodzi, po prostu wycofaj migrację i zmień nazwę i ponownie uruchom migrację.

 php artisan migrate:rollback

wyedytowałem moje pytanie powyżej, spójrz teraz .. mam komunikat o błędzie w gitbash
Ariasa
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.