💻 Exemplos: Capítulo 07: Relacionamentos Eloquent (1:1, 1:N, N:N) e Eager Loading
Especialização em Backend com PHP & Laravel • Demonstrações Práticas Compiláveis
💻 Exemplo 1 — Relacionamento 1:N e N:N com Pivot
<?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);
}
}
<?php
// app/Models/Pedido.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Pedido extends Model
{
public function cliente(): BelongsTo
{
return $this->belongsTo(Cliente::class);
}
public function produtos(): BelongsToMany
{
return $this->belongsToMany(Produto::class, 'item_pedidos')
->withPivot('quantidade', 'preco_unitario')
->withTimestamps();
}
}
💻 Exemplo 2 — Controller Comparando N+1 vs. Eager Loading
<?php
// app/Http/Controllers/Api/PedidoController.php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Pedido;
class PedidoController extends Controller
{
public function semOtimizacao()
{
// ❌ N+1: dispara 1 query por pedido ao acessar ->cliente
$pedidos = Pedido::all();
return $pedidos->map(fn ($p) => $p->cliente->nome);
}
public function comEagerLoading()
{
// ✅ 2 queries totais, independente do volume de pedidos
$pedidos = Pedido::with(['cliente', 'itens', 'produtos'])->paginate(15);
return response()->json($pedidos);
}
}
💻 Exemplo 3 — withCount() para Métricas sem Carregar Coleções
<?php
// app/Http/Controllers/Api/ClienteController.php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Cliente;
class ClienteController extends Controller
{
public function clientesVip()
{
$clientes = Cliente::withCount('pedidos')
->having('pedidos_count', '>', 5)
->orderByDesc('pedidos_count')
->get();
return response()->json($clientes);
}
}