Capítulo 2.2: Criando o Modelo Planet
Tempo de estudo: 45 minutos
1. O Modelo no Laravel: Planta de um Objeto Espacial
Na arquitetura MVC (Model-View-Controller), o modelo é:
- 📦 Um contêiner para dados (parâmetros de planetas)
- 🔌 Uma interface para interagir com o banco de dados
- 🛡️ O centro da lógica de negócios da aplicação
💡 Analogia Espacial: O modelo
Planet
= A planta de um planeta no computador do Centro de Controle da Missão (CCM). Com ele, você pode:
- Criar um novo planeta no catálogo (
INSERT
)- Obter dados sobre Marte (
SELECT
)- Atualizar informações sobre a atmosfera (
UPDATE
)
2. Criando o Modelo e a Migração
Laravel usa o Artisan CLI — seu "painel de controle" do projeto.
Passo 1: Gerando o modelo com a migração
O que foi criado:
app/
└── Models/
└── Planet.php ← Modelo
database/
└── migrations/
└── 2025_08_04_000000_create_planets_table.php ← Migração
Flags do Artisan:
-m
→ Criar uma migração-c
→ Criar um controller-r
→ Um controller de recursos
💡 Dica Profissional: Essas flags podem ser combinadas para máxima eficiência. O comando
php artisan make:model Planet -mcr
criará imediatamente o modelo, a migração e um controller de recursos para gerenciar esse modelo. Isso economiza muito tempo.
3. Configurando o Modelo Planet
Abra app/Models/Planet.php
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Planet extends Model
{
// Nome da tabela (por padrão: 'planets')
// O Laravel assume automaticamente que o nome da tabela é o plural do nome do modelo em snake_case (Planet -> planets).
// Portanto, esta propriedade não é obrigatória aqui, mas é útil para clareza.
protected $table = 'planets';
// Campos permitidos para preenchimento em massa
protected $fillable = [
'name',
'description',
'size_km',
'solar_system',
'image_url'
];
// Tipos de dados para conversão automática
protected $casts = [
'size_km' => 'integer'
];
}
Explicação das Propriedades:
Propriedade | Valor | Exemplo de Dados |
---|---|---|
$table |
Nome da tabela no BD | planets |
$fillable |
Campos para preenchimento em massa | name , size_km |
$casts |
Conversão automática de tipos | size_km: integer |
4. Design da Tabela de Planetas
Antes de editar a migração, vamos definir a estrutura de um "planeta":
Campo | Tipo de Dados | Descrição | Exemplo de Valor |
---|---|---|---|
id |
BIGINT (PK) | ID Único | 1 |
name |
VARCHAR(255) | Nome do planeta | "Marte" |
description |
TEXT | Descrição | "Planeta vermelho..." |
size_km |
INTEGER | Diâmetro em km | 6779 |
solar_system |
VARCHAR(100) | Sistema Solar | "Sistema Solar" |
image_url |
VARCHAR(2048) | URL da foto (pode ser nulo) | "https://..." |
created_at |
TIMESTAMP | Data de criação | 2025-08-04 12:00:00 |
updated_at |
TIMESTAMP | Data de atualização | 2025-08-05 09:30:00 |
5. Editando a Migração
Abra o arquivo de migração em database/migrations/..._create_planets_table.php
:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePlanetsTable extends Migration
{
public function up()
{
Schema::create('planets', function (Blueprint $table) {
$table->id(); // BIGINT auto-incremento
$table->string('name')->unique();
$table->text('description');
$table->integer('size_km');
$table->string('solar_system', 100);
$table->string('image_url', 2048)->nullable();
$table->timestamps(); // created_at + updated_at
});
}
public function down()
{
Schema::dropIfExists('planets');
}
}
Pontos Chave:
->unique()
→ Garante a unicidade dos nomes->nullable()
→ O campo pode ser nulotimestamps()
→ Gerenciamento automático de datas
6. Executando a Migração (Prévia)
Embora a execução será no Capítulo 2.3, vamos ver como será:
Saída Esperada:
Migrating: 2025_08_04_000000_create_planets_table
Migrated: 2025_08_04_000000_create_planets_table (32.15ms)
Verificação no pgAdmin 4:
- Abra o banco de dados
space_api
→ Schemas → Tables - A tabela
planets
deve aparecer com seus campos
7. Abordagem Alternativa: Geradores de Código
Para acelerar o desenvolvimento, você pode usar pacotes:
- Laravel Blueprint - cria modelos/migrações a partir de uma descrição YAML
- InfyOm Laravel Generator - gerador baseado em um esquema de BD
Exemplo de Blueprint:
models:
Planet:
name: string:255
description: text
size_km: integer
solar_system: string:100
image_url: string:2048? # O caractere '?' significa que o campo pode ser nulo
Quiz para Consolidação
🚀 Resumo do Capítulo: Você criou um "gêmeo digital" do planeta! Agora seu projeto tem:
- 🪐 Modelo
Planet
com lógica de negócios - 📊 Migração para a tabela
planets
no PostgreSQL - 🛠️ Propriedades do modelo configuradas (
fillable
,casts
)
Prepare o banco de dados! No próximo capítulo, executaremos a migração e preencheremos o universo com os primeiros planetas.
📌 Verificação:
Certifique-se de que os arquivos
Planet.php
e..._create_planets_table.php
foram criados nos diretórios corretos.⚠️ Se o Artisan reclamar:
- Verifique se você está na pasta do projeto
- Certifique-se de que as dependências estão instaladas (
composer install
)- Para Windows: adicione PHP e Composer ao PATH