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);
    }
}