Урок 10

Query Builder

Что такое Query Builder

Query Builder — это построитель SQL-запросов. Он позволяет собирать запросы через цепочку методов, не привязываясь к конкретной модели. Работает напрямую с таблицами через фасад DB.

Query Builder быстрее Eloquent и удобен для сложных запросов, отчётов, агрегатов.

Базовые операции

use Illuminate\Support\Facades\DB;

$users = DB::table('users')->get();
$user = DB::table('users')->where('name', 'Alice')->first();
$names = DB::table('users')->pluck('name');
$count = DB::table('users')->count();

Условия

DB::table('users')->where('age', '>', 18)->get();
DB::table('users')->where('name', 'like', 'A%')->get();
DB::table('users')->whereIn('role', ['admin', 'moderator'])->get();
DB::table('users')->whereNull('deleted_at')->get();
DB::table('users')->whereBetween('age', [18, 30])->get();

Сортировка и лимит

DB::table('users')->orderBy('created_at', 'desc')->limit(10)->get();
DB::table('users')->latest()->take(5)->get();

Вставка

DB::table('users')->insert([
    'name' => 'Bob',
    'email' => 'bob@example.com',
]);

$id = DB::table('users')->insertGetId([...]);

Обновление и удаление

DB::table('users')->where('id', 1)->update(['name' => 'New']);
DB::table('users')->where('id', 1)->delete();

Агрегаты

DB::table('orders')->sum('amount');
DB::table('orders')->avg('amount');
DB::table('orders')->max('amount');
DB::table('orders')->min('amount');

Join

DB::table('posts')
    ->join('users', 'posts.user_id', '=', 'users.id')
    ->select('posts.title', 'users.name')
    ->get();

Группировка

DB::table('orders')
    ->select('user_id', DB::raw('SUM(amount) as total'))
    ->groupBy('user_id')
    ->having('total', '>', 1000)
    ->get();

Транзакции

DB::transaction(function () {
    DB::table('users')->where('id', 1)->update(['balance' => 100]);
    DB::table('users')->where('id', 2)->update(['balance' => 50]);
});

Если внутри замыкания произойдёт исключение — все изменения откатятся.