Site

Query Builder & Collections v3

O Query Builder da v3 prioriza I/O mínimo: first() real com LIMIT 1, ordenação fluente, mutações atômicas e resposta JSON direta.


first() performático

Injeta LIMIT 1 e usa PDO::fetch() — não carrega uma Collection inteira em memória.

$user = user::where('email', 'admin@app.com')->first();
$post = post::with('category')->where('slug', $slug)->first();
$item = product::where('id', $id)->firstOrFail();
💡Performance
Prefira first() / firstOrFail() a get()->first() em hot paths (login, painel, listagens).

asc() / desc()

product::desc('price')->limit(10)->get();
product::where('category_id', $catId)->asc('name')->get();
order::asc('status')->desc('created_at')->get();

increment() / decrement()

UPDATE atômico — exige WHERE.

user::where('id', $id)->increment('login_count');
product::where('id', $productId)->decrement('stock', 1);

// ERRADO (sem WHERE) → Exception
// user::query()->increment('login_count');
🚨Sem WHERE = Exception
Increment/decrement sem cláusula WHERE são bloqueados de propósito (segurança de economia do servidor).

json() — resposta HTTP direta

return post::where('active', true)
    ->desc('created_at')
    ->limit(5)
    ->json();

return post::where('featured', 1)->json(200, ['X-Cache' => 'HIT']);

Equivalente via Request:

json($posts, 200, ['X-Cache' => 'HIT']);

Collections

get() e relações attachMany / relatedToMany retornam Collections com:

each, map, filter, first, pluck, groupBy, implode, sum, avg, take, sortBy, drop

$titles = product::where('category_id', $catId)
    ->get()
    ->pluck('title');