🧩 Exercícios: Relacionamentos Eloquent e Eager Loading
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:
- Definir relacionamento
hasMany(Pedido::class)no Cliente ebelongsTo(Cliente::class)no Pedido.
Resultado Esperado
Relacionamento 1:N mapeado com métodos de navegação bidirecionais.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_07_1_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_07_2_SeuNome - 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:
- Mapear relação N:M entre
PedidoeProdutoatravés da tabelaitem_pedidoscom campos de pivotquantidadeepreco_unitario.
Resultado Esperado
Tabela de junção com dados de pivot acessíveis via `$produto->pivot->quantidade`.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_07_3_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_07_4_SeuNome - 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.');