Я пытаюсь получить связанные модели того же типа из сводной таблицы.
У меня есть 2 модели, App\Models\User и App\Models\Group и модель поворота App\Pivots\GroupUser
Мои таблицы имеют следующую структуру
пользователи
группы
group_user
В настоящее время я определил отношения как
В приложении / 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?
Спасибо.






Вы не можете сделать это с помощью 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, вы получите набор пользователей, которые находятся в тех же группах, что и текущий пользователь.