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