Come posso rinominare la colonna in laravel usando la migrazione?


92

Ho colonne come menzionato di seguito:

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

}

Ho fatto la seminatrice al tavolo stnk

Ora voglio rinominare idin id_stnk.
Ho aggiunto una "dottrina / dbal" nel "compositore" e faccio un file composer update.

Ho fatto la migrazione php artisan migration:make rename_column.
Quindi ho aggiunto un nuovo metodo per rename_column:

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

});

E poi ho provato a eseguire il comando php artisan migratema ho ricevuto un errore come menzionato di seguito:

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

Risposte:


120

Devi creare un altro file di migrazione e posizionarlo lì:

Correre

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

Quindi all'interno del nuovo posto del file di migrazione:

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

}

ho modificato la mia domanda sopra, guarda ora .. ho un messaggio di errore in gitbash
Ariasa

L'errore 150 è un vincolo di chiave esterna. Significa che hai altre tabelle che fanno riferimento a idsul stnktavolo.
Laurence

3
Nota per Laravel 5 è ora make:migratione nonmigrate:make
Jason

9
Inoltre, affinché la ridenominazione delle colonne funzioni, è necessario richiedere un pacchetto che è stato rimosso in L5.Senza di "doctrine/dbal": "~2.3"questo si ottengono alcuni errori molto oscuri. È stato sollevato come bug qui github.com/laravel/framework/issues/3116 e con una menzione probabilmente meno utile nella documentazione qui laravel.com/docs/5.0/schema#renaming-columns
Jason

Una volta eseguita la migrazione, è necessario eliminare il file e aggiornare lo schema di creazione originale?
Chiedo

31

la prima cosa che vuoi fare è creare il tuo file di migrazione.

Digita la tua riga di comando

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

Dopo aver creato il file. Apri il nuovo file di migrazione creato nella cartella della tua app in database / migrations.

Nel tuo metodo up inserisci questo:

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

e nel tuo metodo down:

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

quindi nella riga di comando digita semplicemente

php artisan migrate

Allora wollah! hai appena rinominato id in id_stnk. BTW che puoi usare

php artisan migrate:rollback

per annullare le modifiche. In bocca al lupo


ho modificato la mia domanda sopra, guarda ora .. ho un messaggio di errore in gitbash
Ariasa

1
Assicurati di aggiungere la dipendenza doctrine / dbal al tuo file composer.json.
Ben

19

Segui questi passaggi, rispettivamente per rinominare il file di migrazione della colonna.

1- C'è la libreria Doctrine / dbal nel tuo progetto. Se non hai eseguito prima il comando

composer require doctrine/dbal

2- creare il file di migrazione di aggiornamento per aggiornare il vecchio file di migrazione. Attenzione (è necessario avere lo stesso nome)

php artisan make:migration update_oldFileName_table

per esempio il mio vecchio nome del file di migrazione: create_users_table nome del file di aggiornamento dovrebbe: update_users_table

3- update_oldNameFile_table.php

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

"dal" nome della mia vecchia colonna e "al" nome della nuova colonna

4- Infine esegui il comando migrate

php artisan migrate

Collegamento alla fonte: documento laravel


14

Rinominare le colonne (Laravel 5.x)

Per rinominare una colonna, è possibile utilizzare il metodo renameColumn nel generatore di schemi. * Prima di rinominare una colonna, assicurati di aggiungere doctrine / dbal dipendenza al tuo file composer.json. *

Oppure puoi semplicemente richiedere il pacchetto usando il compositore ...

composer require doctrine/dbal

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

Nota: usa make: migration e non migrate: make for Laravel 5.x


Non utilizzare alcuna colonna come ENUM nella tabella che stai tentando di modificare. Doctrine / dbal non sa di cosa si tratta ..... Ho dovuto cambiare la migrazione originale per avere il nome corretto all'inizio e resettare l'intero database. Fortunatamente ero ancora in fase di sviluppo. Pensavo che Laravel & Co lo rendessero una dipendenza dal compositore sin dall'inizio?
mikoop

@mikoop Originariamente era una dipendenza dall'inizio, nelle versioni precedenti del framework. Ma questa dipendenza è troppo pesante e non comunemente usata. Quindi è stato rimosso. (Questo è il riassunto; ci sono state molte discussioni prima della decisione. In effetti, la comunità ha chiesto la sua rimozione ed è stata ascoltata.)
J. Bruni

renameColumn è stato deprecato in doctrine e attualmente rimosso.
Sander Visser

10

Gettando i miei $ 0,02 qui perché nessuna delle risposte ha funzionato, ma mi ha mandato sulla strada giusta. Quello che è successo è stato che un precedente vincolo straniero stava generando l'errore. Ovvio se ci pensi.

Quindi, nel upmetodo della nuova migrazione , prima elimina il vincolo originale, rinomina la colonna, quindi aggiungi di nuovo il vincolo con il nuovo nome della colonna. Nel downmetodo, fai l'esatto opposto in modo da tornare all'impostazione venduta.

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

Spero che questo faccia risparmiare tempo a qualcuno in futuro!


1

La risposta di cui sopra è ottima o, se non ti farà male, basta ripristinare la migrazione e cambiare il nome ed eseguire di nuovo la migrazione.

 php artisan migrate:rollback

ho modificato la mia domanda sopra, guarda ora .. ho un messaggio di errore in gitbash
Ariasa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.