У меня есть модель с именем User
, которая имеет отношение BelongsToMany и называется lineManagers()
. Это отношение возвращает коллекцию User
моделей. Характер этой настройки позволяет отношениям типа «родитель-потомок» работать на нескольких уровнях.
BelongsToMany использует таблицу с именем line_manager_user
, которая имеет простую схему сопоставления идентификатора пользователя с идентификатором пользователя менеджера линии :
| user_id | line_manager_id |
User A -> lineManagers()-> User B
User C -> lineManagers() -> User D
В зависимости от определенных разрешений, я хочу иметь возможность запрашивать эту взаимосвязь на нескольких уровнях для пользователей, у которых есть линейный менеджер с указанным c users.id
, потенциально использующий whereHas()
но я знаю, что это может сильно ухудшить производительность.
Я пробовал приведенный ниже запрос, но безрезультатно (последний раздел относится к этой части):
$query = User::query()
->with('lineManagers')
->orderBy('first_name')
->orderBy('last_name')
->havingEmploymentStatus(UserEmploymentStatus::EMPLOYED)
->whereHas('lineManagers.lineManagers.lineManagers', function (Builder $query) {
$query->where('id', $this->getAuthenticatedUser()->id);
});
Я специально не хочу 3 уровня, в идеале запрос будет получать lineManagers
, пока не будет достигнута пустая коллекция. К сожалению, это должно быть сделано на уровне запросов, а не на уровне сбора