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

Sam Taylor спросил: 07 октября 2018 в 11:24 в: laravel

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

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

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

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

  • id
группы
  • ID
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. До сих пор я пробовал это:

app / Models / User.php

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

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

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

app / Models / 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?

Спасибо.

0 ответов