Blog EspecializaTi
Carlos Ferreira Por: Carlos Ferreira Comentar

Alterar Tabela com Migrations no Laravel sem Perder os Dados

Alterar Tabela com Migrations no Laravel sem Perder os Dados

O recurso de migrations do laravel é muito útil para gerenciar bancos de dados de pequeno e médio porte, pois possibilita criar toda a estrutura das tabelas do banco de dados, mesmo possuindo pouquíssimo conhecimentos de SQL.

Através das classes que o Laravel dispõe é possível definir toda a estrutura de tabelas do banco de dados, desde a definição da estrutura das tabelas, ordem de criação, relacionamentos entre as tabelas e até mesmo o preenchimento de dados Fakes nas tabelas com o recurso de Factories.

Para sistemas com bancos de dados de pequeno e médio porte é muito útil e usual trabalhar com migrations, mas, em sistemas com bancos de dados extremamente complexos com centenas de tabelas, views, relacionamentos e base com muitas informações o sistema de migration é inviável, porque fica difícil gerenciar sem o auxílio de um software de SGBD avançado.

Enfim, a ideia aqui não é de forma alguma desmerecer o recurso de migration, até mesmo porque é MUITO bom e uso bastante no meu dia a dia com o Laravel.

Dependendo o projeto que for desenvolver, é possível trabalhar com algum software de SGBD para gerenciar o banco de dados e fazer o papel reverso, que é criar as migrations a partir de um banco de dados existente.

O foco deste tutorial será apresentar uma alternativa muito procurada, por quem usa as migrations para gerenciar o banco de dados, que é adicionar uma nova coluna em uma tabela sem perder os dados existentes.

Uma das formas de alterar a estrutura de uma tabela através de uma migration é alterar o arquivo de migration que representa a estrutura da tabela e rodar o clássico comando:

php artisan migrate:refresh

Este comando funciona bem, pois irá atualizar a estrutura de tabelas, deixando com as novas características definidas nos arquivos de migrations.
Porém, tudo tem um preço, e neste caso é preço caro, porque este comando ele primeiramente deleta todas as tabelas, e depois recria novamente com a nova estrutura. Para o ambiente de desenvolvimento é perfeito e funciona muito bem, porém, em produção seria um desastre.

 

Como atualizar a estrutura de uma tabela em produção?

Em produção precisa tomar mais cuidado, porque não pode em hipótese alguma perder os dados do banco de dados.

Para exemplificar, vamos aplicar isso a um exemplo real, inicialmente temos a migration /database/migrations/2014_10_12_000000_create_users_table.php que tem a estrutura default da tabela de usuários (users):

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

Para criar a tabela users com essa estrutura basta simplesmente rodar o clássico comando:

php artisan migrate

Este comando vai criar a tabela users exatamente com a estrutura definida.

 

Ah, esqueci de adicionar a coluna imagem, e agora?

Neste caso, podemos criar um novo arquivo de migration que altera a estrutura desta tabela, no caso adicionando um novo campo.

Para criar um novo arquivo de migration para alterar a estrutura da tabela users, adicionando novas opções rode este comando:

php artisan make:migration add_name_field_table_name --table=users

Um nome mais real para este comando seria:

php artisan make:migration add_image_table_users --table=users

Após rodar este comando vai gerar um novo arquivo, mais ou menos com este mesmo nome (apenas timestamps diferente) /database/migrations/2018_02_19_092346_add_image_table_users.php, com os métodos up() e down().

No método up() definimos a coluna, ou as colunas que serão acrescentadas, por exemplo:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('image') // Nome da coluna
                    ->nullable() // Preenchimento não obrigatório
                    ->after('password'); // Ordenado após a coluna "password"
    });
}

O método down() tem a responsabilidade de deletar a coluna em caso de roolback, veja como pode ficar:

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

Agora que já criamos o arquivo de migration que vai atualizar a estrutura da tabela users, podemos rodar o comando para atualizar a tabela:

php artisan migrate

Apenas isso! =D

 

Obrigado pela leitura e se tiver alguma sugestão de tutorial, por favor, me envie, terei o maior prazer em analisar.

Abraços []’s

 
 

Carlos Ferreira

Sobre o Autor:

Carlos Ferreira

Carlos Ferreira é Analista de Sistemas Experiente, Empreendedor, Fundador da empresa EspecializaTi. Certificações: Comptia Linux +, LPI, Novell Certification.

Todos os direitos reservados © 2018 - EspecializaTi. É proibida a reprodução total ou parcial deste conteúdo.