Skip to content

Capítulo 2.3: Migrações de Banco de Dados

Tempo de estudo: 50 minutos


1. Migrações: Construindo uma Estação Espacial

Migrações no Laravel são um sistema de controle de versão para o seu banco de dados.

Imagine que você está:

  1. 🏗️ Criando um projeto de estação (migração create_planets_table)
  2. 🚀 Implantando módulos (executando migrações)
  3. 🔧 Modernizando a construção (novas migrações)
  4. ⏪ Pode reverter para uma versão anterior (rollback)

💡 Importante: As migrações permitem que a equipe trabalhe de forma consistente – como engenheiros em diferentes continentes construindo a ISS!


2. Executando Migrações

Após criar a migração no capítulo 2.2, execute:

php artisan migrate

Saída no terminal:

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (25.12ms)
Migrating: 2014_10_12_100000_create_password_reset_tokens_table
Migrated:  2014_10_12_100000_create_password_reset_tokens_table (18.07ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (21.33ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (30.45ms)
Migrating: 2025_08_04_000000_create_planets_table
Migrated:  2025_08_04_000000_create_planets_table (15.67ms)  # Sua tabela!

Verificação no pgAdmin 4:

  1. Abra o banco de dados space_api → Schemas → Tables
  2. Certifique-se de que apareceram: - planets - users - password_reset_tokens

3. Revertendo Migrações: Retorno de Emergência

Se precisar corrigir a estrutura:

php artisan migrate:rollback  # Reverte o último lote de migrações
php artisan migrate:reset    # Reverte todas as migrações completamente

  • php artisan migrate:fresha comando mais útil no desenvolvimento! Ele remove todas as tabelas e executa novamente todas as migrações.
  • php artisan migrate:fresh --seed — faz o mesmo que fresh, mas após as migrações, executa imediatamente os seeders. Este é um comando para "recriar" completamente o banco de dados do zero.

Cenário de uso:

# Passo 1: Percebemos que há um erro na migração. Recriamos completamente o banco de dados.
php artisan migrate:fresh
# Passo 2: Editamos a migração
# Passo 3: Recriamos novamente o banco de dados com a migração já corrigida
php artisan migrate:fresh


4. Adicionando Novos Campos: Modernizando a Estação

Exemplo: Adicionaremos o campo is_habitable (se o planeta é habitável).

Passo 1: Criamos uma nova migração

php artisan make:migration add_is_habitable_to_planets_table

Passo 2: Editamos o arquivo database/migrations/..._add_is_habitable_to_planets_table.php

<?php
public function up()
{
    Schema::table('planets', function (Blueprint $table) {
        $table->boolean('is_habitable')
              ->default(false);
    });
}

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

Passo 3: Executamos a atualização

php artisan migrate


5. Preenchendo o Banco de Dados: Primeiros Planetas

Criamos um seeder — um script para gerar dados de teste.

Passo 1: Geração do seeder

php artisan make:seeder PlanetSeeder

Passo 2: Editamos database/seeders/PlanetSeeder.php

<?php
use App\Models\Planet; // Importamos o modelo do planeta - Sem ele, você receberá um erro!


class PlanetSeeder extends Seeder
{
    public function run()
    {
        Planet::create([
            'name' => 'Terra',
            'description' => 'Planeta azul com vida diversa',
            'size_km' => 12742,
            'solar_system' => 'Sistema Solar',
            'image_url' => 'https://example.com/earth.jpg',
            'is_habitable' => true
        ]);

        Planet::create([
            'name' => 'Marte',
            'description' => 'Planeta vermelho, alvo de futuras colonizações',
            'size_km' => 6779,
            'solar_system' => 'Sistema Solar',
            'is_habitable' => false
        ]);
    }
}

Passo 3: Registramos o seeder em database/seeders/DatabaseSeeder.php

<?php
public function run()
{
    $this->call([
        PlanetSeeder::class
    ]);
}

Passo 4: Executando o preenchimento

php artisan db:seed


6. Trabalhando com PostgreSQL: Especificidades

Características do tipo de dados:

Funcionalidade PostgreSQL MySQL Comentário Laravel
Tipo Booleano boolean (verdadeiro true/false) tinyint(1) (armazena 0/1) $table->boolean('...') funciona para ambos
JSON jsonb (binário, indexável) json (textual) $table->jsonb('...') - muito poderoso no PG
Arrays text[], integer[] (arrays nativos) Não (emulado via JSON ou strings) $table->array('...') (exclusivo para PG)
Ordem das colunas Não pode ser controlado (after() não funciona) Pode ser controlado (after()) Laravel abstrai isso, mas é importante saber da limitação

Exemplo de criação de índice:

// Na migração
$table->index('solar_system');


7. Verificando dados no psql

Você pode usar qualquer cliente gráfico e selecionar space_api lá para visualização.

Ao usar o console:

psql -U postgres -d space_api
# O terminal pode pedir a senha que você definiu durante a instalação do PostgreSQL.
SELECT * FROM planets;

De qualquer forma, a saída deve ser a seguinte:

id name description size_km solar_system image_url is_habitable
1 Terra Planeta azul com vida diversa 12742 Sistema Solar ... true
2 Marte Planeta vermelho, alvo de colonizações 6779 Sistema Solar null false

Quiz para fixação

1. Comando para executar migrações:

2. Como reverter a última migração?

3. Seeders são usados para:

4. Método para adicionar uma coluna a uma tabela existente:

5. Onde os seeders são registrados?


🚀 Resumo do Capítulo:

Você dominou a "construção de infraestrutura espacial":

  • ✅ Criou e executou migrações
  • 🔧 Modernizou a estrutura da tabela
  • 🌍 Preencheu o BD com os primeiros planetas
  • ⚙️ Aprendeu a trabalhar com PostgreSQL

Seu universo ganhou os primeiros mundos! Agora você pode prosseguir para a criação de interfaces API para gerenciar planetas.

📌 Verificação:

  1. Execute php artisan tinker
  2. Execute App\Models\Planet::all()
  3. Certifique-se de que vê a Terra e Marte