Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Построитель запросов

Eloquent и фасад DB строят SQL-запросы цепочкой методов. Писать SQL вручную не нужно, а значения подставляются безопасно — через подготовленные запросы. Все методы из этого урока работают и с моделями, и с DB::table().

Условия

Метод where() принимает столбец, оператор и значение. Оператор = можно не писать:

use App\Models\Post;
 
$published = Post::where('is_published', true)->get();
$popular = Post::where('views', '>', 1000)->get();

Несколько where() подряд соединяются через «И». Для «ИЛИ» есть orWhere():

$posts = Post::where('is_published', true)
    ->where('views', '>', 100)
    ->orWhere('is_pinned', true)
    ->get();

Частые условия

МетодЧто выбирает
whereIn('id', [1, 2, 3])Значение из списка
whereNull('deleted_at')Пустое значение
whereBetween('price', [100, 500])Значение в диапазоне
whereDate('created_at', '2025-01-30')Записи за дату
where('title', 'like', '%чай%')Поиск по части строки

Группировка условий

Чтобы расставить скобки, условия передают в функцию:

$posts = Post::where('is_published', true)
    ->where(function ($query) {
        $query->where('views', '>', 1000)
            ->orWhere('is_pinned', true);
    })
    ->get();

Получится is_published AND (views > 1000 OR is_pinned).

Сортировка и ограничение

$latest = Post::orderBy('created_at', 'desc')->limit(5)->get();
 
$latest = Post::latest()->take(5)->get();

latest() — короткая запись сортировки по дате создания.

Выбор столбцов и одного значения

$posts = Post::select('id', 'title')->get();
 
$titles = Post::pluck('title');
$byId = Post::pluck('title', 'id');
 
$title = Post::where('id', 1)->value('title');

pluck() возвращает коллекцию значений одного столбца, value() — одно значение.

Подсчёты

$count = Post::where('is_published', true)->count();
$max = Post::max('views');
$average = Post::avg('views');
$exists = Post::where('slug', 'hello')->exists();

exists() быстрее, чем count() > 0: база останавливается на первой найденной строке.

Условие по необходимости

when() добавляет условие, только если значение задано, — удобно для фильтров из формы:

$posts = Post::query()
    ->when($request->category, fn ($query, $category) => $query->where('category_id', $category))
    ->when($request->search, fn ($query, $search) => $query->where('title', 'like', "%{$search}%"))
    ->latest()
    ->get();

Запросы без модели

Фасад DB работает с таблицей напрямую и возвращает обычные объекты:

use Illuminate\Support\Facades\DB;
 
$users = DB::table('users')
    ->join('posts', 'posts.user_id', '=', 'users.id')
    ->select('users.name', DB::raw('COUNT(posts.id) as posts_count'))
    ->groupBy('users.id', 'users.name')
    ->get();

Частая ошибка

Цепочка методов только описывает запрос. Он выполняется на последнем шаге — get(), first(), count(). Без него в переменной окажется построитель запросов, а не данные:

$posts = Post::where('is_published', true);        // запроса ещё не было
$posts = Post::where('is_published', true)->get(); // коллекция статей

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.