Извлечение связанных моделей с помощью hasManyThrough на сводной таблице - Laravel 5.7 - PullRequest
0 голосов
/ 01 ноября 2018

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

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

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

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

  • ID

группа

  • ID

group_user

  • ID
  • 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?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

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

0 голосов
/ 01 ноября 2018

Вы пробовали Жадная загрузка . Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...