intermediate 14 min read

Query Builder

The Laravel query builder, joins, unions, aggregations, raw expressions, and Laravel 13 additions.

Query Builder

use Illuminate\Support\Facades\DB;

$users = DB::table("users")
->where("is_active", true)
->orderBy("name")
->limit(10)
->get();

// Select specific columns
$emails = DB::table("users")->pluck("email");

// First record
$user = DB::table("users")->where("id", 1)->first();

Joins

$posts = DB::table("posts")
->join("users", "posts.user_id", "=", "users.id")
->select("posts.*", "users.name as author")
->where("posts.is_published", true)
->get();

// Left join
DB::table("posts")->leftJoin("comments", "posts.id", "=", "comments.post_id");

// Cross join
DB::table("sizes")->crossJoin("colors");

Aggregates

$count = DB::table("users")->count();
$max = DB::table("orders")->max("total");
$avg = DB::table("reviews")->avg("rating");
$exists = DB::table("users")->where("email", $email)->exists();

Laravel 13: Query Builder Enhancements

// whereAny / whereAll for multi-column searches
DB::table("posts")->whereAny(["title", "body"], "like", "%search%")->get();

// upsert with multiple unique keys
DB::table("users")->upsert(
$records,
["email"],
["name", "updated_at"]
);

Examples

<?php
use Illuminate\Support\Facades\DB;

// Get users with post counts using a join and aggregate
\$users = DB::table('users')
    ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
    ->select('users.id', 'users.name', DB::raw('COUNT(posts.id) as post_count'))
    ->groupBy('users.id', 'users.name')
    ->orderByDesc('post_count')
    ->get();

echo \$users->first()?->name . ': ' . \$users->first()?->post_count;

Your Notes

Sign in to take notes for this lesson.

Discussion

Sign in to join the discussion.

Flashcards

Sign in to create flashcards.