Это может быть идеальным вариантом использования Laravel Collection.
$result = $user->load('groups.groupUsers.players')
->groups
->map->groupUsers
->collapse()
->filter(function ($groupUser) use ($user) {
return $groupUser->isNot($user);
})
->unique('id')
->map->players
->collapse()
->unique('id');
Другой подход - использование запроса для получения результата.
Сначала давайте создадим подзапрос дляполучить все группы, к которым присоединился пользователь.
$groupsJoinedByUser = Group::whereHas('users', function ($query) use ($user) {
$query->whereKey($user->id);
});
Мы также можем создать этот подзапрос следующим образом:
$groupsJoinedByUser = Group::select('groups.*')
->join('group_user', 'groups.id', '=', 'group_user.group_id')
->where('group_user.user_id', $user->id);
Теперь мы можем создать запрос для получения игроков:
$players = Player::select('players.*')
->join('users', 'players.user_id', '=', 'users.id')
->join('group_user', 'users.id', '=', 'group_user.user_id')
->joinSub($groupsJoinsByUser, 'groups_joined_by_user', function($join) {
$join->on('group_user.group_id', '=', 'groups_joined_by_user.id')
})
->where('users.id', '!=', $user->id);
->distinct()
->get();