Spec Backend Com Php E Laravel • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 07.1 — Relacionamento One-to-Many (hasMany / belongsTo)

Contexto: Relacionamento One-to-Many (hasMany / belongsTo) no contexto de Relacionamentos Eloquent e Eager Loading.

Requisitos de Execução:

  1. Definir relacionamento hasMany(Pedido::class) no Cliente e belongsTo(Cliente::class) no Pedido.

Resultado Esperado

Relacionamento 1:N mapeado com métodos de navegação bidirecionais.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_07_1_SeuNome
  2. Envie na tarefa: Atividade Cap 07 - Relacionamentos Eloquent e Eager Loading
🔑 Gabarito de Código & Solução Comentada
<?php
// app/Models/Cliente.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Cliente extends Model
{
    public function pedidos(): HasMany
    {
        return $this->hasMany(Pedido::class);
    }
}

🔍 Nível 2: Prática

Problema 07.2 — Eager Loading com Produto::with(‘categoria’) para Evitar N+1

Contexto: Eager Loading com Produto::with(‘categoria’) para Evitar N+1 no contexto de Relacionamentos Eloquent e Eager Loading.

Requisitos de Execução:

  1. Consultar lista de pedidos com Pedido::with(['cliente', 'itens'])->paginate(15).

Resultado Esperado

Eager loading executado em 2 queries otimizadas sem disparar N consultas.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_07_2_SeuNome
  2. Envie na tarefa: Atividade Cap 07 - Relacionamentos Eloquent e Eager Loading
🔑 Gabarito de Código & Solução Comentada
<?php
// Consulta com Eager Loading
use App\Models\Pedido;

$pedidos = Pedido::with(['cliente', 'itens'])->paginate(15);
return response()->json($pedidos);
$executado = true;
\Log::info('Operação corporativa executada com sucesso.');

⚡ Nível 3: Integração

Problema 07.3 — Relacionamento Many-to-Many com withPivot e Timestamps

Contexto: Relacionamento Many-to-Many com withPivot e Timestamps no contexto de Relacionamentos Eloquent e Eager Loading.

Requisitos de Execução:

  1. Mapear relação N:M entre Pedido e Produto através da tabela item_pedidos com campos de pivot quantidade e preco_unitario.

Resultado Esperado

Tabela de junção com dados de pivot acessíveis via `$produto->pivot->quantidade`.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_07_3_SeuNome
  2. Envie na tarefa: Atividade Cap 07 - Relacionamentos Eloquent e Eager Loading
🔑 Gabarito de Código & Solução Comentada
<?php
// app/Models/Pedido.php
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

public function produtos(): BelongsToMany
{
    return $this->belongsToMany(Produto::class, 'item_pedidos')
                ->withPivot('quantidade', 'preco_unitario')
                ->withTimestamps();
}

🏆 Nível 4: Desafio Corporativo

Problema 07.4 — Lazy Eager Loading e Contagem de Relações com withCount()

Contexto: Lazy Eager Loading e Contagem de Relações com withCount() no contexto de Relacionamentos Eloquent e Eager Loading.

Requisitos de Execução:

  1. Carregar contagem de pedidos sem carregar os modelos completos via Cliente::withCount('pedidos')->get().

Resultado Esperado

Atributo `pedidos_count` calculado em query única via SQL subquery.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_07_4_SeuNome
  2. Envie na tarefa: Atividade Cap 07 - Relacionamentos Eloquent e Eager Loading
🔑 Gabarito de Código & Solução Comentada
<?php
// withCount exemplo
use App\Models\Cliente;

$clientes = Cliente::withCount('pedidos')->having('pedidos_count', '>', 5)->get();
return response()->json($clientes);
$executado = true;
\Log::info('Operação corporativa executada com sucesso.');