Adicionar uma nova coluna à tabela existente em uma migração

270

Não consigo descobrir como adicionar uma nova coluna à minha tabela de banco de dados existente usando a estrutura do Laravel.

Tentei editar o arquivo de migração usando ...

<?php

public function up()
{
    Schema::create('users', function ($table) {
        $table->integer("paid");
    });
}

No terminal, eu executo php artisan migrate:installe migrate.

Como adiciono novas colunas?

kim larsen
fonte
Seria útil se você incluísse algum erro; O que você espera que aconteça; e o que realmente acontece?
Phill Sparks
9
Ótima pergunta. Há muita documentação de migração por aí e mostra a API e como criar tabelas pela primeira vez. Então tudo falha quando você desenvolve seu aplicativo mais e precisa modificar sua estrutura de banco de dados.
Andrew Koper

Respostas:

611

Para criar uma migração, você pode usar o comando migrate: make na Artisan CLI. Use um nome específico para evitar conflitos com modelos existentes

para o Laravel 3:

php artisan migrate:make add_paid_to_users

para o Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

Você precisará usar o Schema::table()método (como você está acessando uma tabela existente, não criando uma nova). E você pode adicionar uma coluna como esta:

public function up()
{
    Schema::table('users', function($table) {
        $table->integer('paid');
    });
}

e não se esqueça de adicionar a opção de reversão:

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

Então você pode executar suas migrações:

php artisan migrate

Tudo isso está bem coberto na documentação do Laravel 3:

E para o Laravel 4 / Laravel 5:

Editar:

use $table->integer('paid')->after('whichever_column');para adicionar este campo após uma coluna específica.

Phill Sparks
fonte
3
Apenasphp artisan migrate
Phill Sparks
Algo está errado. Eu faço "db: make" para criar um novo arquivo de migração. E então eu coloquei o Schema :: table ('users', function ($ table) {$ table-> integer ('paid');}); afim disso. E executar "php artesão migrar", mas recebendo erro fatal: os usuários podem classe não redeclare em /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php na linha 3
Kim Larsen
A criação de migrações também é abordada na documentação. Você deve atribuir um nome mais específico, como "add_paid_to_users", para que não colidir com o modelo.
Phill Sparks
Parece que qualquer URL de documento do Laravel 3 está redirecionando para os documentos do Laravel 4. Aqui estão os links para o 3 doc para construtor de esquema e migrações
6
A partir de Laravel 5, este comando seria agoraphp artisan make:migration add_paid_to_users
mikelovelyuk
64

Acrescentarei a resposta de mike3875 para futuros leitores usando o Laravel 5.1 e seguintes.

Para tornar as coisas mais rápidas, você pode usar a bandeira "--table" assim:

php artisan make:migration add_paid_to_users --table="users"

Isso adicionará o conteúdo do método upe downautomaticamente:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        //
    });
}

Da mesma forma, você pode usar a --create["table_name"]opção ao criar novas migrações que adicionarão mais clichê às suas migrações. Ponto pequeno, mas útil ao fazer um monte deles!

camelCase
fonte
2
Esse não foi o caso no Laravel 5.0, Blueprintfoi adicionado no Laravel 5.1. Apenas um ponto de esclarecimento é tudo.
Phill Sparks
@PhillSparks Você está certo, obrigado por pegar meu erro. Atualizei para esclarecer a versão em que isso pode ser usado.
CamelCase #
24

Se você estiver usando o Laravel 5, o comando seria;

php artisan make:migration add_paid_to_users

Todos os comandos para fazer as coisas (controladores, modelos, migrações etc.) foram movidos sob o make:comando

php artisan migrate ainda é o mesmo.

mikelovelyuk
fonte
24

laravel 5.6 e superior

caso você queira adicionar uma nova coluna como uma CHAVE ESTRANGEIRA a uma tabela existente.

Crie uma nova migração executando este comando: make: migration

Exemplo:

php artisan make:migration add_store_id_to_users_table --table=users

Na pasta banco de dados / migrações, você tem um novo arquivo de migração, algo como:

2018_08_08_093431_add_store_id_to_users_table.php (veja os comentários)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddStoreIdToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Create new column
            // You probably want to make the new column nullable
            $table->integer('store_id')->unsigned()->nullable()->after('password');

            // 2. Create foreign key constraints
            $table->foreign('store_id')->references('id')->on('stores')->onDelete('SET NULL');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Drop foreign key constraints
            $table->dropForeign(['store_id']);

            // 2. Drop the column
            $table->dropColumn('store_id');
        });
    }
}

Depois disso, execute o comando:

php artisan migrate

Caso você queira desfazer a última migração por qualquer motivo, execute este comando:

php artisan migrate:rollback

Você pode encontrar mais informações sobre migrações nos documentos

chebaby
fonte
1
Resposta muito abrangente e relevante. Obrigado!
Musicin3d 10/05/19
17

Você pode adicionar novas colunas dentro do Schema::createmétodo inicial como este:

Schema::create('users', function($table) {
    $table->integer("paied");
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

Se você já criou uma tabela, pode adicionar colunas adicionais a essa tabela criando uma nova migração e usando o Schema::tablemétodo:

Schema::table('users', function($table) {
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

A documentação é bastante completa sobre isso e não mudou muito da versão 3 para a versão 4 .

plaina
fonte
Algo está errado. Eu faço "db: make" para criar um novo arquivo de migração. E então eu coloquei o Schema :: table ('users', function ($ table) {$ table-> integer ('paid');}); afim disso. E executar "php artesão migrar", mas recebendo erro fatal: os usuários podem classe não redeclare em /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php na linha 3
Kim Larsen
Você deve nomear cada uma das migrações como algo único ao criá-las. Normalmente a inicial criar Vou citar create_users_table, então se eu estou adicionando colunas: add_email_password_columns_to_users.
Tplaner
sim, como o evoluir diz, certamente é melhor seguir as filosofias originais de design de laravel e usar apenas o " add_" verbo na frente de cada arquivo para acompanhar as alterações. Dessa forma, é mais fácil rastrear alterações no controle de versão, etc., porque um novo arquivo de adição é criado para cada iteração. Se você continuasse modificando o " create_", seria difícil saber que x empregado, tinha estragado alguma coisa removendo um índice ou adicionando uma nova coluna etc etc. pelo menos isso faz sentido na minha cabeça! :)
wired00
7

você pode simplesmente modificar seu arquivo de migração existente, por exemplo, adicionando uma coluna à sua tabela e digitando o seu terminal:

$ php artisan migrate:refresh
Mahana Delacour
fonte
11
Atualizar vai esvaziar a mesa
JohnTaa
8
Isso é incrivelmente perigoso - se algumas pessoas executam a versão antiga, outras terão a nova e o caos se seguirá. No Liquibase, se você editar um arquivo, ele falhará, a menos que você explique exceções explicitamente, e você só pode fazer isso em pouquíssimos casos. Por exemplo, se você criar uma coluna não nula quando algum banco de dados já tiver dados nulos, ela será interrompida.
John pouco
3
Seria melhor, se você editar sua resposta e mencionar que isso esvaziaria sua tabela, seria melhor.
Abel
Nota: Este comando irá limpar toda bases de dados tabelas , se você quiser usá-lo, em seguida, fazer backup de seu banco de dados primeiro
Udhav Sarvaiya
5

isso é trabalhado no laravel 5.1.

primeiro, no seu terminal, execute este código

php artisan make:migration add_paid_to_users --table=users

depois disso, vá para o diretório do projeto e expanda o banco de dados do diretório - migração e edição do arquivo add_paid_to_users.php, adicione este código

public function up()
{
    Schema::table('users', function (Blueprint $table) {
         $table->string('paid'); //just add this line
    });
}

Depois disso, volte ao seu terminal e execute este comando

php artisan migrate

Espero que isso ajude.

Rosidin Bima
fonte
5

Primeiro reverta sua migração anterior

php artisan migrate:rollback

Depois disso, você pode modificar o arquivo de migração existente (adicionar novo, renomear ou excluir colunas) e executar novamente o arquivo de migração

php artisan migrate
noobgrammer
fonte
0

Embora um arquivo de migração seja a melhor prática, como já foi mencionado por outros, em uma pitada, você também pode adicionar uma coluna com o funileiro.

$ php artisan tinker

Aqui está um exemplo de uma linha para o terminal:

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ $table->integer('paid'); })



(Aqui está formatado para facilitar a leitura)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
mfink
fonte