Часто при составлении запросов возникает необходимость выборки данных из двух и более таблиц. Для этих целей в MySQL существуют известные команды как LEFT JOIN и RIGHT JOIN. Возникает вопрос, если мы работаем в Laravel используя встроенные методы, то каким образом можно сделать выборку с двух или более таблиц?
Для этих целей в Laravel существуют соответствующие методы. Так например, для выборки результата из нескольких таблиц мы можем воспользоваться методом leftJoin(). Рассмотрим пример, когда у нас есть две таблицы users и orders. Соответственно, в первой таблице будут храниться записи о пользователях, во второй — заказы пользователей.
Используя данный метод, давайте сделаем выборку пользователей из таблицы users, а также по полю id сделаем выборку из таблицы orders.
$users = DB::table('users') ->leftJoin('orders', 'users.id', '=', 'orders.user_id') ->get();
В результате мы получим записи всех пользователей (таблица users), а также записи всех заказов пользователя по id.
В качестве параметров метод принимает следующие значения. Первый параметр orders – это наименование таблицы, которую следует связать в запросе. Последующие параметры – условие для связки двух таблиц. В примере выше поле id таблицы users должно быть равно полю user_id таблицы orders.
Теперь давайте рассмотрим пример с условием по сложнее. Тут для таблицы orders мы так же добавим дополнительное условие, которое должно соблюдаться при выборке данных из этой таблицы.
Предположим, что в таблице orders у нас есть колонка status, которая содержит статус заказа. Условимся, если заказ оплачен, колонка статуса будет содержать значение «P» (т.е. payed).
$users = DB::table('users') ->leftJoin('orders', 'users.id', '=', 'orders.user_id') ->leftjoin('orders', function ($join) { $join->on('orders', 'users.id', '=', 'orders.user_id')->where('orders.status', '=', "P"); }) ->get();
Как мы может заметить, в этом примере в качестве второго параметра метода leftJoin() передаётся встроенный запрос (вложенная функция), в которой проверяется соответствие (метод on()) id пользователя из таблицы users с колонкой user_id таблицы orders. Кроме того, посредством метода where() проверяется значение поля status таблицы orders.
Некоторые поля в таблицах могут называться одинаково. Специальные однотипные поля в некоторых случаях даже рекомендуют называть одинаково, чтобы было удобнее взаимодействовать с таблицами. Так, например такие поля как id, created_at, updated_at, и др. могут присутствовать в разных таблицах. Так чтобы не было путаницы с помощью метода select() мы можем указать конкретные поля каждой таблиц которые нас интересуют.
$users = DB::table('users') ->leftJoin('orders', 'users.id', '=', 'orders.user_id') ->leftjoin('orders', function ($join) { $join->on('orders', 'users.id', '=', 'orders.user_id')->where('orders.status', '=', "P"); }) ->select( 'users.*', 'orders.id as order_id', 'orders.status as order_status', ) ->get();
В результате мы получим все колонки таблицы users, а также колонки id и status в виде order_id и order_status из таблицы orders.