О web-разработке
и даже немного больше...

Использование метода leftJoin() для выборки из нескольких таблиц в Laravel

Часто при составлении запросов возникает необходимость выборки данных из двух и более таблиц. Для этих целей в MySQL существуют известные команды как LEFT JOIN и RIGHT JOIN. Возникает вопрос, если мы работаем в Laravel используя встроенные методы, то каким образом можно сделать выборку с двух или более таблиц?

Для этих целей в Laravel существуют соответствующие методы. Так например, для выборки результата из нескольких таблиц мы можем воспользоваться методом leftJoin(). Рассмотрим пример, когда у нас есть две таблицы users и orders. Соответственно, в первой таблице будут храниться записи о пользователях, во второй — заказы пользователей.

Метод leftJoin()

Используя данный метод, давайте сделаем выборку пользователей из таблицы users, а также по полю id сделаем выборку из таблицы orders.

$users = DB::table('users')
            ->leftJoin('orders', 'users.id', '=', 'orders.user_id')
            ->get();

В результате мы получим записи всех пользователей (таблица users), а также записи всех заказов пользователя по id.

Параметры метода leftJoin()

В качестве параметров метод принимает следующие значения. Первый параметр orders – это наименование таблицы, которую следует связать в запросе. Последующие параметры – условие для связки двух таблиц. В примере выше поле id таблицы users должно быть равно полю user_id таблицы orders.

Теперь давайте рассмотрим пример с условием по сложнее. Тут для таблицы orders мы так же добавим дополнительное условие, которое должно соблюдаться при выборке данных из этой таблицы.

Метод leftJoin() со сложным условием

Предположим, что в таблице 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.

Опубликован: 26.09.2024 г.

См. также:

Ограничение параметров в маршрутах Laravel
Необязательные параметры маршрутов в Laravel
Как выбрать записи за определённый период (День, Месяц, Год) в Laravel?
Как просмотреть SQL запрос в Eloquent Laravel?
Как объявить переменную в шаблоне Laravel Blade?
Проверка на пустоту коллекций Eloquent в Laravel
Как получить URL текущей страницы в Laravel?
Как вывести роуты Laravel в отдельный файл?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта