Wie kann ich eine Spalte in Laravel mithilfe der Migration umbenennen?

86

Ich habe Spalten wie unten erwähnt:

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');
    });

}

Ich habe Sämaschine zum Tisch gemacht

Jetzt möchte ich umbenennen idin id_stnk.
Ich habe dem "Komponisten" eine "Doktrin / Dbal" hinzugefügt und mache eine .composer update

Ich habe Migration gemacht php artisan migration:make rename_column.
Dann habe ich rename_column eine neue Methode hinzugefügt:

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

});

Und dann habe ich versucht, den Befehl auszuführen, php artisan migrateaber ich habe den folgenden Fehler erhalten:

[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)
Ariasa
quelle

Antworten:

113

Sie müssen eine weitere Migrationsdatei erstellen - und dort ablegen:

Lauf

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

Dann in der neuen Migrationsdatei platzieren:

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');
        });
    }

}
Laurence
quelle
Ich habe meine Frage oben bearbeitet, schau sie dir jetzt an. Ich habe eine Fehlermeldung in Gitbash
Ariasa
Fehler 150 ist eine Fremdschlüsselbeschränkung. Dies bedeutet, dass Sie andere Tabellen haben, die idauf die stnkTabellen verweisen .
Laurence
3
Hinweis für Laravel 5 ist es jetzt make:migrationund nichtmigrate:make
Jason
8
Damit das Umbenennen von Spalten funktioniert, müssen Sie ein Paket benötigen, das in L5 entfernt wurde. Andernfalls erhalten "doctrine/dbal": "~2.3"Sie einige sehr undurchsichtige Fehler. Es wurde als Fehler hier github.com/laravel/framework/issues/3116 und mit einer wohl weniger nützlichen Erwähnung in der Dokumentation hier laravel.com/docs/5.0/schema#renaming-columns
Jason
Sollte die Datei nach Abschluss der Migration gelöscht und das ursprüngliche Erstellungsschema aktualisiert werden?
Ich
27

Als erstes möchten Sie Ihre Migrationsdatei erstellen.

Geben Sie Ihre Befehlszeile ein

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

Nach dem Erstellen der Datei. Öffnen Sie die neu erstellte Migrationsdatei in Ihrem App-Ordner unter Datenbank / Migrationen.

Fügen Sie in Ihre up-Methode Folgendes ein:

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

und in Ihrer Down-Methode:

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

Geben Sie dann einfach in Ihre Befehlszeile ein

php artisan migrate

Dann wollah! Sie haben gerade id in id_stnk umbenannt. Übrigens können Sie verwenden

php artisan migrate:rollback

um die Änderungen rückgängig zu machen. Viel Glück

Webartisan
quelle
Ich habe meine Frage oben bearbeitet, schau sie dir jetzt an. Ich habe eine Fehlermeldung in Gitbash
Ariasa
1
Stellen Sie sicher, dass Sie die Doctrine / Dbal-Abhängigkeit zu Ihrer composer.json-Datei hinzufügen.
Ben
16

Befolgen Sie diese Schritte, um die Spaltenmigrationsdatei umzubenennen.

1- Gibt es in Ihrem Projekt eine Doctrine / Dbal-Bibliothek? Wenn Sie den Befehl nicht zuerst ausgeführt haben

composer require doctrine/dbal

2- Erstellen Sie eine Update-Migrationsdatei, um die alte Migrationsdatei zu aktualisieren. Warnung (muss den gleichen Namen haben)

php artisan make:migration update_oldFileName_table

Beispiel: Der Name meiner alten Migrationsdatei: create_users_table Der Name der Aktualisierungsdatei sollte lauten: update_users_table

3- update_oldNameFile_table.php

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

'von' meinem alten Spaltennamen und 'zu' meinem neuen Spaltennamen

4- Führen Sie abschließend den Befehl migrate aus

php artisan migrate

Quelllink : Laravel-Dokument

melih sahin
quelle
14

Spalten umbenennen (Laravel 5.x)

Um eine Spalte umzubenennen, können Sie die Methode renameColumn im Schema-Generator verwenden. * Stellen Sie vor dem Umbenennen einer Spalte sicher, dass Sie die Datei doctrine / dbal zu Ihrer Datei composer.json hinzufügen . *

Oder Sie können das Paket einfach mit Composer anfordern ...

composer require doctrine/dbal

Quelle: https://laravel.com/docs/5.0/schema#renaming-columns

Hinweis: Verwenden Sie make: migration und nicht migrate: make für Laravel 5.x.

bmatovu
quelle
Verwenden Sie in der Tabelle, die Sie bearbeiten möchten, keine Spalten als ENUM. Doctrine / dbal weiß nicht, was das ist ..... Ich musste die ursprüngliche Migration ändern, um beim Start den richtigen Namen zu erhalten, und die gesamte Datenbank zurücksetzen. Zum Glück war ich noch in der Entwicklung. Ich würde davon ausgehen, dass Laravel & Co dies von Anfang an zu einer Abhängigkeit des Komponisten machen würde.
Mikoop
@mikoop Es war ursprünglich von Anfang an eine Abhängigkeit in früheren Versionen des Frameworks. Diese Abhängigkeit ist jedoch zu stark und wird nicht häufig verwendet. Also wurde es entfernt. (Dies ist die Zusammenfassung; vor der Entscheidung gab es viele Diskussionen. Tatsächlich hat die Gemeinde um ihre Entfernung gebeten und wurde angehört.)
J. Bruni
renameColumn war in der Doktrin veraltet und wird derzeit entfernt.
Sander Visser
9

Ich habe meine $ 0,02 hier reingeworfen, da keine der Antworten funktioniert hat, aber mich auf den richtigen Weg geschickt hat. Was geschah, war, dass eine frühere ausländische Einschränkung den Fehler auslöste. Offensichtlich, wenn Sie darüber nachdenken.

Löschen Sie also in der upMethode Ihrer neuen Migration zuerst diese ursprüngliche Einschränkung, benennen Sie die Spalte um und fügen Sie die Einschränkung dann erneut mit dem neuen Spaltennamen hinzu. Bei der downMethode machen Sie genau das Gegenteil, damit die verkaufte Einstellung wiederhergestellt wird.

/**
 * 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');
    });
}

Hoffe das spart jemandem etwas Zeit in der Zukunft!

Stan Smulders
quelle
1

Die obige Antwort ist großartig. Wenn Sie nicht verletzt werden, setzen Sie die Migration einfach zurück, ändern Sie den Namen und führen Sie die Migration erneut aus.

 php artisan migrate:rollback
Jay Temp
quelle
Ich habe meine Frage oben bearbeitet, schau sie dir jetzt an. Ich habe eine Fehlermeldung in Gitbash
Ariasa