Часто при составлении запросов возникает необходимость выборки данных из двух и более таблиц. Для этих целей в MySQL существуют известные команды как LEFT JOIN и RIGHT JOIN. Возникает вопрос, если мы работаем в Laravel используя встроенные методы, то каким образом можно сделать выборку с двух или более таблиц?
Для этих целей в Laravel существуют соответствующие методы. Так например, для выборки результата из нескольких таблиц мы можем воспользоваться методом leftJoin(). Рассмотрим пример, когда у нас есть две таблицы users и orders. Соответственно, в первой таблице будут храниться записи о пользователях, во второй — заказы пользователей.
Используя данный метод, давайте сделаем выборку пользователей из таблицы users, а также по полю id сделаем выборку из таблицы orders.
1 2 3 | $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).
1 2 3 4 5 6 | $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() мы можем указать конкретные поля каждой таблиц которые нас интересуют.
01 02 03 04 05 06 07 08 09 10 11 | $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.