Получение связанных моделей с помощью hasManyThrough в сводной таблице - Laravel 5.7

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

У меня есть 2 модели, App\Models\User и App\Models\Group и модель поворота App\Pivots\GroupUser

Мои таблицы имеют следующую структуру

пользователи

  • я бы

группы

  • я бы

group_user

  • я бы
  • ID пользователя
  • group_id

В настоящее время я определил отношения как

В приложении / Models / User.php

public function groups()
{
    return $this->belongsToMany(Group::class)->using(GroupUser::class);
}

В приложении / Models / Group.php

public function users()
{
    return $this->belongsToMany(User::class)->using(GroupUser::class);
}

В приложении / Pivots / GroupUser.php

public function user()
{
    return $this->belongsTo(User::class);
}

public function group()
{
    return $this->belongsTo(Group::class);
}

Я пытаюсь определить отношения в моем классе User для доступа ко всем другим пользователям, которые связаны, находясь в одной группе. Назовем его friends. Пока я пробовал это:

приложение / Модели / User.php

public function friends()
{
    return $this->hasManyThrough(
        User::class,
        GroupUser::class,
        'user_id',
        'id'
    );
}

Но в конечном итоге он просто возвращает коллекцию только с пользователем, от которого я вызвал связь. (то же, что и при запуске collect($this);

У меня есть решение, которое работает, но не идеально.

приложение / Модели / User.php

public function friends()
{
    $friends = collect();
    foreach($this->groups as $group) {
        foreach($group->users as $user) {
            if ($friends->where('id', $user->id)->count() === 0) {
                $friends->push($user);
            }
        }
    }

    return $friends;
}

Есть ли способ сделать это с помощью hasManyThrough или какой-либо другой функции Eloquent?

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
5
0
7 205
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете сделать это с помощью hasManyThrough, потому что в таблице users нет внешнего ключа, чтобы связать его с id таблицы group_user. Вы можете попробовать перейти от пользователя к их группам к их друзьям, используя существующие отношения belongsToMany:

приложение / Модели / User.php:

// create a custom attribute accessor
public function getFriendsAttribute()
{
    $friends = $this->groups()                                          // query to groups
                    ->with(['users' => function($query) {               // eager-load users from groups
                        $query->where('users.id', '!=', $this->id);     // filter out current user, specify users.id to prevent ambiguity
                    }])->get()
                    ->pluck('users')->flatten();                        // massage the collection to get just the users

    return $friends;
}

Затем, когда вы вызовете $user->friends, вы получите набор пользователей, которые находятся в тех же группах, что и текущий пользователь.

Другие вопросы по теме