laravel: Как получить столбец, связанный с другим столбцом в сводной таблице (сводная таблица с 3 столбцами) - PullRequest
1 голос
/ 06 марта 2020

Я не уверен, как сформулировать этот вопрос, но мне нужно сделать следующее:

У меня есть сводная таблица с тремя столбцами user_id, account_id, role_id

Так что в моей базе данных, если у меня есть эти строки на account_role_user (сводная)

|---------------------|------------------|-------------
|     account_id      |     user_id      |   role_id  |
|---------------------|------------------|-------------
|          1          |         1        |     1      |
|---------------------|--------------------------------
|          2          |         2        |     1       |
------------------------------------------------------
|          1          |         2        |     3      |
------------------------------------------------------

Роль - 1 = владелец

Роль - 3 = менеджер

Я пытаюсь получить пользователей с указанной c учетной записью с указанной ролью c. Но я могу только запрашивать такие вещи, как App\User::with('accounts.roles')->whereId(2)->first();, который показывает пользователей в учетной записи, но группирует их роли, которые не специфицированы c, для учетной записи .

* 1020. * Мне нужны только те пользователи и их роли, которые имеют отношение к учетной записи.

Если я запрашиваю учетную запись с идентификатором 1 и хочу перечислить пользователей этой учетной записи по их роли, у меня должно быть что-то вроде :

$account = App\Account::find(1)

User with ID of 1 has a role id of 1 on the account id of 1

User with ID of 2 has a role id of 3 on the account id of 1

Модель пользователя:

    public function accounts() {
        return $this->belongsToMany('App\Account', 'account_role_user', 'user_id', 'account_id');
    }

    public function roles() {
        return $this->belongsToMany('App\Role', 'account_role_user', 'user_id', 'role_id');
    }

Модель учетной записи:

    public function users() {
        return $this->belongsToMany('App\User', 'account_role_user', 'account_id', 'user_id');
    }

    public function roles() {
        return $this->belongsToMany('App\Role', 'account_role_user', 'account_id', 'role_id');
    }

Ролевая модель:

   public function users() {
    return $this->belongsToMany('App\User', 'account_role_user', 'role_id', 'user_id');
   }

   public function accounts() {
      return $this->belongsToMany('App\Account', 'account_role_user', 'role_id', 'account_id');
     }

1 Ответ

2 голосов
/ 06 марта 2020

Благодаря чьей-то помощи на канале Discord Laravel я понял это.

На модели Account я изменил отношение users() на:

    public function users() {
        return $this->belongsToMany('App\User', 'account_role_user')
        ->using('App\AccountRoleUser')
        ->withPivot('role_id');
    }

Я создал сводную модель с именем AccountRoleUser

namespace App;


use Illuminate\Database\Eloquent\Relations\Pivot;

class AccountRoleUser extends Pivot
{
    public function role() {
        return $this->belongsTo('App\Role');
    }
}

И на модели User я изменил отношение accounts() на:

    public function accounts() {
        return $this->belongsToMany(Account::class, 'account_role_user')->withPivot('role_id');
    }

Теперь мой запрос действительно лаконично и логично:

$account = auth()->user()->accounts->where('foo', 'bar')->first();
$users = $account->users;

У каждого пользователя в коллекции есть объект pivot, который теперь происходит из сводной модели.

Это означает, что теперь я могу делать что-то вроде:

@foreach ($users as $user)
  <p>This is user {{ $user->first_name }} {{ $user->last_name }} with a role of 
   {{$user->pivot->role->description}} 
</p>
@endforeach
...