Конструктор запросов в моделях Eloquent в Laravel
В прошлом уроке мы получали данные
через Post::all() - сразу
все строки таблицы. На практике
так делают редко: нужны записи
с условием, часть списка для пагинации,
выборка по нескольким id.
Для этого в Laravel есть
построитель запросов.
Мы уже разбирали его отдельно:
цепочка методов после DB::table
и в конце get для получения
результата. Тот же набор методов
доступен и у моделей Eloquent.
Разница только в начале цепочки. Вместо имени таблицы строкой пишут имя модели. Запрос по-прежнему строится по шагам, а в коллекции оказываются объекты модели - не просто строки из базы.
Сравним один и тот же запрос
двумя способами - через
DB::table и через модель:
<?php
// через построитель запросов
$posts = DB::table('posts')
->where('id', '>', 3)
->get();
// то же самое через модель
$posts = Post::where('id', '>', 3)->get();
?>
Синтаксис после первого вызова совпадает. Дальше в уроке все примеры через модели - так принято в контроллерах с Eloquent.
Условие where
Метод where отбирает строки
по условию на колонку. Три аргумента:
имя поля, оператор и значение.
Если оператор =, его можно
не писать - Laravel подставит сам.
Получим пользователей с возрастом
30 лет:
<?php
$users = User::where('age', 30)->get();
dump($users);
?>
Условие с оператором сравнения -
например, посты с id
больше 3:
<?php
$posts = Post::where('id', '>', 3)->get();
dump($posts);
?>
Методы можно вызывать цепочкой.
Добавим второе условие -
только опубликованные посты
с большим id:
<?php
$posts = Post::where('id', '>', 3)
->where('published', 1)
->get();
dump($posts);
?>
Диапазон whereBetween
Когда значение должно попасть
в интервал «от и до», удобнее
whereBetween, чем два
отдельных where.
Вторым аргументом передают массив
из двух границ.
Выберем пользователей с зарплатой
от 100 до 300:
<?php
$users = User::whereBetween('salary', [100, 300])->get();
dump($users);
?>
Метод whereNotBetween работает
наоборот - значение должно быть
вне указанного промежутка.
Сдвиг skip и лимит take
Иногда нужна не вся таблица,
а «страница» записей: пропустить
первые несколько строк и взять
следующие. Для этого служат
skip и take -
аналог OFFSET и LIMIT в SQL.
Нумерация с нуля: skip(3)
пропускает три записи, выборка
начинается с четвёртой.
Получим всех пользователей,
начиная с четвёртого:
<?php
$users = User::skip(3)->get();
dump($users);
?>
Чтобы ограничить число строк,
добавляют take.
Пять пользователей, начиная
с четвёртого:
<?php
$users = User::skip(3)->take(5)->get();
dump($users);
?>
skip и take часто
комбинируют с where -
сначала фильтр, потом срез списка.
Список значений whereIn
Если нужно проверить, что поле
равно одному из нескольких значений,
используют whereIn.
Второй аргумент - массив допустимых
значений. Так короче, чем писать
длинную цепочку orWhere.
Получим посты с id
1, 3, 4
или 5:
<?php
$posts = Post::whereIn('id', [1, 3, 4, 5])->get();
dump($posts);
?>
Метод whereNotIn исключает
перечисленные значения -
все записи, кроме указанных id.
Практические задачи
Получите всех юзеров
с возрастом 30.
Получите всех юзеров с зарплатой
от 100 до 300.
Получите всех юзеров, начиная с четвертого.
Получите всех юзеров, начиная
с четвертого, 5 штук.
Получите всех юзеров с id,
равным 1, 3, 4
или 5.