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?


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.


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!


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.


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


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 .


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

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.


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

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'); 
});
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.