Построитель запросов
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(); // коллекция статей