В этом посте я хотел бы поделиться с вами, опытом использования подзапросов с использованием whereIn и whereNotIn.

Иногда нам может потребоваться создать запрос на выборку, с использование SQL оператора WHERE с условиями IN или NOT IN. Возможно, что вы знаете как написать запрос, используя MySQL, но испытываете затруднение в построении запроса с использованием Laravel Query Builder. В этом примере мы узнаем, как преобразовать запрос MySQL в Laravel Query Builder.

Сначала мы cформируем запрос на SQL, преобразуем его в Laravel Query Builder.

В этом примере у меня есть две таблицы:

  • users
  • users_invited

WHERE IN

В первом запросе нам требуется выбрать пользователей, которые присутствуют только в таблице users_invited. Сделать это мы можем, используя приведенный ниже SQL-запрос:

SELECT * FROM `users` WHERE `id` IN (SELECT `user_id` FROM `users_invited`)

Этот же запрос с использованием Laravel Query Builder:

$users = DB::table("users")->select('*')
    ->whereIn('id',function($query) {
        $query->select('user_id')->from('invite_users');
    })
    ->get();

WHERE NOT IN

Во втором запросе нам необходимо выбрать пользователей, которых нет в таблице users_invited. SQL-запрос:

SELECT * FROM `users` WHERE `id` NOT IN ( SELECT `user_id` FROM `invite_users` )

Laravel Query Builder:

$users = DB::table("users")->select('*')
    ->whereNOTIn('id', function($query) {
        $query->select('user_id')->from('invite_users');
    })
    ->get();

Перевод статьи «Laravel 5 — whereIn and whereNotIn with subquery example using query builder».