🧩 Exercícios: Seeders, Factories e Transações de Banco
Spec Backend Com Php E Laravel • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 08.1 — Model Factory com Dados Fictícios do Faker
Contexto: Model Factory com Dados Fictícios do Faker no contexto de Seeders, Factories e Transações de Banco.
Requisitos de Execução:
- Criar
ProdutoFactorygerando dados realistas com$this->faker->words(),randomFloat()eboolean().
Resultado Esperado
Factory configurada com estados padrão para geração de massa de testes.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_1_SeuNome - Envie na tarefa:
Atividade Cap 08 - Seeders, Factories e Transações de Banco
🔑 Gabarito de Código & Solução Comentada
<?php
// database/factories/ProdutoFactory.php
namespace Database\Factories;
use App\Models\Produto;
use Illuminate\Database\Eloquent\Factories\Factory;
class ProdutoFactory extends Factory
{
protected $model = Produto::class;
public function definition(): array
{
return [
'nome' => $this->faker->words(3, true),
'sku' => $this->faker->unique()->bothify('PROD-####-??'),
'preco' => $this->faker->randomFloat(2, 10, 500),
'ativo' => true,
];
}
}
🔍 Nível 2: Prática
Problema 08.2 — Database Seeder Populando Dados em Cascata
Contexto: Database Seeder Populando Dados em Cascata no contexto de Seeders, Factories e Transações de Banco.
Requisitos de Execução:
- Implementar
DatabaseSeedergerando 10 clientes com 3 pedidos cada usandoCliente::factory()->has(Pedido::factory()->count(3))->create().
Resultado Esperado
Seeding executado: 10 clientes e 30 pedidos associados persistidos.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_2_SeuNome - Envie na tarefa:
Atividade Cap 08 - Seeders, Factories e Transações de Banco
🔑 Gabarito de Código & Solução Comentada
<?php
// database/seeders/DatabaseSeeder.php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Cliente;
use App\Models\Pedido;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
Cliente::factory(10)
->has(Pedido::factory()->count(3))
->create();
}
}
⚡ Nível 3: Integração
Problema 08.3 — Transações Atômicas com DB::transaction() e Retries
Contexto: Transações Atômicas com DB::transaction() e Retries no contexto de Seeders, Factories e Transações de Banco.
Requisitos de Execução:
- Executar criação de pedido e baixa de estoque encapsulados em
DB::transaction(callback, 3).
Resultado Esperado
Transação atômica concluída com sucesso com política de 3 tentativas em caso de deadlock.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_3_SeuNome - Envie na tarefa:
Atividade Cap 08 - Seeders, Factories e Transações de Banco
🔑 Gabarito de Código & Solução Comentada
<?php
// transacao_pedido.php
use Illuminate\Support\Facades\DB;
use App\Models\Pedido;
function criarPedidoTransacional(array $dados, array $itens) {
return DB::transaction(function () use ($dados, $itens) {
$pedido = Pedido::create($dados);
foreach ($itens as $item) {
$pedido->itens()->create($item);
}
return $pedido;
}, 3);
}
🏆 Nível 4: Desafio Corporativo
Problema 08.4 — Bloqueio Pessimista com lockForUpdate()
Contexto: Bloqueio Pessimista com lockForUpdate() no contexto de Seeders, Factories e Transações de Banco.
Requisitos de Execução:
- Aplicar
Produto::where('id', $id)->lockForUpdate()->first()para evitar concorrência em estoque.
Resultado Esperado
Linha bloqueada no banco até a finalização da transação.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_4_SeuNome - Envie na tarefa:
Atividade Cap 08 - Seeders, Factories e Transações de Banco
🔑 Gabarito de Código & Solução Comentada
<?php
// pessimistic_lock.php
use App\Models\Produto;
$produto = Produto::where('id', 1)->lockForUpdate()->first();
$produto->decrement('estoque', 1);
$executado = true;
\Log::info('Operação corporativa executada com sucesso.');