Como posso renomear a coluna no laravel usando a migração?

88

Tenho as colunas mencionadas abaixo:

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

}

Eu fiz semeadora para mesa

Agora eu quero renomear idpara id_stnk.
Eu adicionei uma "doutrina / dbal" no "compositor" e faço a composer update.

Eu fiz a migração php artisan migration:make rename_column.
Então, adicionei um novo método para rename_column:

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

});

E então eu tentei executar o comando, php artisan migratemas obtive o erro mencionado abaixo:

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

Respostas:

115

Você precisa criar outro arquivo de migração - e colocá-lo lá:

Corre

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

Em seguida, dentro do novo local do arquivo de migração:

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
fonte
Eu editei minha pergunta acima, olhe agora .. eu tenho uma mensagem de erro no gitbash
Ariasa
O erro 150 é uma restrição de chave estrangeira. Isso significa que você tem outras tabelas que fazem referência a idna stnktabela.
Laurence
3
Nota para o Laravel 5 é agora make:migratione nãomigrate:make
Jason
8
Além disso, para que a renomeação de colunas funcione, você precisa exigir um pacote que foi removido no L5. "doctrine/dbal": "~2.3"Sem isso, você obterá alguns erros muito obscuros. Foi levantado como um bug aqui github.com/laravel/framework/issues/3116 e com uma menção indiscutivelmente menos útil na documentação aqui laravel.com/docs/5.0/schema#renaming-columns
Jason
Depois de concluída a migração, o arquivo deve ser excluído e o esquema de criação original atualizado? Apenas perguntando como manter as coisas limpas
órbita
27

a primeira coisa que você deseja fazer é criar seu arquivo de migração.

Digite sua linha de comando

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

Depois de criar o arquivo. Abra o novo arquivo de migração criado na pasta do seu aplicativo em banco de dados / migrações.

Em seu método up, insira o seguinte:

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

e em seu método de descida:

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

então em sua linha de comando basta digitar

php artisan migrate

Então wollah! você acabou de renomear id para id_stnk. BTW, você pode usar

php artisan migrate:rollback

para desfazer as alterações. Boa sorte

webartisan
fonte
editei minha pergunta acima, olhe agora .. tenho mensagem de erro no gitbash
Ariasa
1
Certifique-se de adicionar a dependência doctrine / dbal ao seu arquivo composer.json.
Ben
16

Siga estas etapas, respectivamente, para renomear o arquivo de migração de coluna.

1- Existe uma biblioteca Doctrine / dbal em seu projeto. Se você não executou o comando primeiro

composer require doctrine/dbal

2- criar arquivo de migração de atualização para arquivo de migração de atualização antigo. Aviso (precisa ter o mesmo nome)

php artisan make:migration update_oldFileName_table

por exemplo, meu antigo nome de arquivo de migração: create_users_table nome de arquivo de atualização deve: update_users_table

3- update_oldNameFile_table.php

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

'de' meu antigo nome de coluna e 'para' meu novo nome de coluna

4- Finalmente execute o comando migrate

php artisan migrate

Link da fonte: documento laravel

melih sahin
fonte
14

Renomeando Colunas (Laravel 5.x)

Para renomear uma coluna, você pode usar o método renameColumn no construtor Schema. * Antes de renomear uma coluna, certifique-se de adicionar a doutrina / dbal dependência ao seu arquivo composer.json. *

Ou você pode simplesmente solicitar o pacote usando o composer ...

composer require doctrine/dbal

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

Nota: Use make: migration e not migrate: make para Laravel 5.x

bmatovu
fonte
Apenas não use nenhuma coluna como um ENUM na tabela que você está tentando editar. O Doctrine / dbal não sabe o que é isso ... Tive que mudar a migração original para o nome correto no início e reiniciar o banco de dados inteiro. Sorte que eu ainda estava em desenvolvimento. Eu pensaria que o Laravel & Co tornaria isso uma dependência do compositor desde o início?
mikoop de
@mikoop Originalmente, era uma dependência desde o início, nas versões anteriores do framework. Mas essa dependência é muito pesada e não costuma ser usada. Portanto, foi removido. (Este é o resumo; houve muita discussão antes da decisão. Na verdade, a comunidade pediu sua remoção e foi ouvida.)
J. Bruni
renameColumn foi preterido na doutrina e atualmente removido.
Sander Visser
9

Jogar meus $ 0,02 aqui, já que nenhuma das respostas funcionou, mas me colocou no caminho certo. O que aconteceu foi que uma restrição externa anterior estava gerando o erro. Óbvio quando você pensa sobre isso.

Portanto, no upmétodo de sua nova migração , primeiro elimine a restrição original, renomeie a coluna e adicione a restrição novamente com o novo nome da coluna. No downmétodo, você faz exatamente o oposto para que ele volte à configuração vendida.

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

Espero que isso economize alguém no futuro!

Stan Smulders
fonte
1

A resposta acima é ótima ou, se não for prejudicá-lo, apenas reverta a migração, altere o nome e execute a migração novamente.

 php artisan migrate:rollback
Jay temp
fonte
Eu editei minha pergunta acima, olhe agora .. eu tenho uma mensagem de erro no gitbash
Ariasa