Laravel запрос исключить данные - PullRequest
0 голосов
/ 11 марта 2020

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

Logi c

  1. Таблица пользователей (user has many roles, user hasOne manager)
  2. Таблица ролей (role belongsTo user)
  3. Таблица менеджеров (managers belongsTo user)

Первый раз

Пользователь с ролью manager Я возвращаю их всех. (скажем, 2 пользователя)

Я сохраняю одного из них в managers таблице.

Второй раз

Пользователь с ролью manager Я возвращаю их все.

Я сохраняю один из них в managers таблице.

Выпуск

Во второй раз я должен получить только пользователя 1, как раньше сохранил один из них в managers таблицу. Но с моим текущим кодом у меня все еще есть 2 пользователя.

Код

$users = User::whereHas("roles", function($q) {
  $q->where("name", "manager");
})->get();

SQL Вывод кода выше:

"select * from `users` where exists (select * from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `users`.`id` = `model_has_roles`.`model_id` and `model_has_roles`.`model_type` = ? and `name` = ?) and `users`.`deleted_at` is null"

Есть идеи?

1 Ответ

0 голосов
/ 11 марта 2020

Исходя из вашего вопроса, я предсказываю, что у вас есть такая структура базы данных:

User
user_id(PK) | ...

Role
role_id(PK) | user_id | name | ...

Manager
manager_id | user_id | ...

Итак, вам нужно опросить всех пользователей, у которых есть role = 'manager', но нет в диспетчере таблиц.

Просто выполните левое соединение:

$users = User::query()
  ->select("user.*")
  ->join("Role", "user.user_id", "=", "role.user_id")
  ->leftJoin("Manager", "manager.user_id", "=", "user.user_id")
  ->whereNull("manager.manager_id")
  ->where("role.name", "=", "manager")
  ->get();

Это сгенерирует этот SQL запрос:

SELECT user.*
FROM
  user
  INNER JOIN role ON role.user_id=user.user_id
  LEFT JOIN manager ON manager.user_id=user.user_id
WHERE manager.manager_id IS NULL AND role.name='manager'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...