Laravel соединить данные в сводной таблице, включающей три таблицы - PullRequest
1 голос
/ 29 февраля 2020

У меня есть следующие модели и сводная таблица:

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

    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');
     }

account_role_user

Кол-во: user_id, role_id, account_id

Пользователь может принадлежать ко многим различным учетным записям и иметь много разных ролей в разных учетных записях.

Таким образом, они часто принадлежат учетной записи «Филлис» с ролью администратора, и они также могут принадлежать учетной записи «Астрос» с ролью менеджера.

Достаточно просто запросить одну связь, например App\User::find(2)->accounts или App\User::find(2)->roles, но у меня проблемы с третьими отношениями.

В данный момент я просто пытаюсь запросить их все и отобразить на странице.

Итак, я ' Я хотел бы перечислить учетные записи, к которым принадлежит текущий пользователь, а также их роль в этой учетной записи.


Редактировать: Дилип Хирапара предоставил следующий запрос

Account::with('users.roles')->wherehas('users', function($q){
    $q->where('users.id','=', 2);
})->get();

Первый индекс коллекция:

Illuminate\Database\Eloquent\Collection {#3024
     all: [
       App\Account {#3069
         id: 1,
         company: "astros",
         created_at: "2020-02-25 12:35:06",
         updated_at: "2020-02-25 12:35:06",
         users: Illuminate\Database\Eloquent\Collection {#3085
           all: [
             App\User {#3071
               id: 1,
               name: "alex",
               email: "alex@fo.com",
               email_verified_at: null,
               created_at: "2020-02-25 12:35:06",
               updated_at: "2020-02-25 12:35:06",
               pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3083
                 account_id: 1,
                 user_id: 1,
               },
               roles: Illuminate\Database\Eloquent\Collection {#3094
                 all: [
                   App\Role {#3096
                     id: 1,
                     level: "owner",
                     created_at: "2020-02-25 12:32:50",
                     updated_at: "2020-02-25 12:32:50",
                     pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3099
                       user_id: 1,
                       role_id: 1,
                     },
                   },
                 ],
               },
             },
             App\User {#3084
               id: 2,
               name: "jeb",
               email: "jebbush@gmail.com",
               email_verified_at: null,
               created_at: "2020-02-25 12:36:57",
               updated_at: "2020-02-25 12:36:57",
               pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3039
                 account_id: 1,
                 user_id: 2,
               },
               roles: Illuminate\Database\Eloquent\Collection {#3091
                 all: [
                   App\Role {#3097
                     id: 2,
                     level: "admin",
                     created_at: "2020-02-25 12:32:50",
                     updated_at: "2020-02-25 12:32:50",
                     pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3088
                       user_id: 2,
                       role_id: 2,
                     },
                   },
                   App\Role {#3100
                     id: 3,
                     level: "manager",
                     created_at: "2020-02-25 12:32:50",
                     updated_at: "2020-02-25 12:32:50",
                     pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3090
                       user_id: 2,
                       role_id: 3,
                     },
                   },
                 ],
               },
             },
           ],
         },
       }

Данные в моей базе данных выражаются как

alex@fo.com (пользователь) - owner (роль) в astros (учетная запись)

jebbush@gmail.com (пользователь) равен admin (роль) в astros (учетная запись)

jebbush@gmail.com (пользователь) равен manager (роль) для phillies (учетная запись)

Таким образом, вы заметите, что запрос получает ВСЕ роли от пользователя независимо от учетной записи.

Итак, я хотел бы запросить учетные записи с указанием пользователей и их ролей. (роли, которые у них есть в указанной c учетной записи)

Также правильны ли мои модельные отношения? Должен Account belongsToMany Role?

1 Ответ

1 голос
/ 29 февраля 2020

Как вы сказали, пользователь принадлежит к компании

И использованию

App\User::with('company','role')->whereId(2)->first();

Таким образом, вы получите пользователя с компания и роли.

App\User::with('accounts.roles')->whereId(2)->first();

Таким образом, вы получите (пользователь с учетными записями) и (учетные записи с соответствующими ролями) конкретно для этого пользователя.

А теперь, если вы хотите использовать его как Учетная запись Модель

Account::with('users.roles')->wherehas('users', function($q){
    $q->where('id','=', 2);
})->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...