Laratrust показывает роль пользователя внутри команды
Я пытаюсь установить связь между командами и пользователями. Latrust в значительной степени выглядит потрясающим пакетом, НО некоторые вещи, которые, как мне кажется, можно объяснить лучше.
Выберем команду (скажем: team_id = 1):
$team = Team::where('id', $request->team_id)->first();
А давайте выберем наших пользователей из команды:
$roles = Role::get();
$users = User::whereRoleIs($roles->pluck('name')->toArray(), $team)->get()
Это приведет к следующему:
{
"message": "ok",
"data": [
{
"id": 1,
"name": "niki",
"email": "niki@user.com",
"email_verified_at": null,
"created_at": "2021-07-12T11:29:09.000000Z",
"updated_at": "2021-07-12T11:29:09.000000Z",
"roles": [
{
"id": 3,
"name": "user",
"display_name": "User",
"description": "User",
"created_at": "2021-07-12T11:29:08.000000Z",
"updated_at": "2021-07-12T11:29:08.000000Z",
"pivot": {
"user_id": 1,
"role_id": 3,
"user_type": "App\\Models\\User"
}
},
{
"id": 4,
"name": "leader",
"display_name": "Leader",
"description": "Leader",
"created_at": "2021-07-12T11:29:08.000000Z",
"updated_at": "2021-07-12T11:29:08.000000Z",
"pivot": {
"user_id": 1,
"role_id": 4,
"user_type": "App\\Models\\User"
}
}
]
},
{
"id": 2,
"name": "konna",
"email": "konna@user.com",
"email_verified_at": null,
"created_at": "2021-07-12T11:29:09.000000Z",
"updated_at": "2021-07-12T11:29:09.000000Z",
"roles": [
{
"id": 3,
"name": "user",
"display_name": "User",
"description": "User",
"created_at": "2021-07-12T11:29:08.000000Z",
"updated_at": "2021-07-12T11:29:08.000000Z",
"pivot": {
"user_id": 2,
"role_id": 3,
"user_type": "App\\Models\\User"
}
},
{
"id": 3,
"name": "user",
"display_name": "User",
"description": "User",
"created_at": "2021-07-12T11:29:08.000000Z",
"updated_at": "2021-07-12T11:29:08.000000Z",
"pivot": {
"user_id": 2,
"role_id": 3,
"user_type": "App\\Models\\User"
}
}
]
}
]
}
Это возвращает все роли, которые есть у этих двух пользователей (оба принадлежат к одной команде).
Как мы можем выбрать ТОЛЬКО роль пользователя в команде?
Я подумал о следующем: получение всех пользовательских записей с помощью
$users
запрос, а затем выбор роли пользователя оттуда.
foreach ($users as $user){
$userArray[] = array_push($userArray, $user->name, $user->roles->first());
}
Однако это вернет роль first() или last (), прикрепленную к пользователю, которая может быть чем угодно (особенно когда пользователь может принадлежать к нескольким командам с другой ролью, прикрепленной к каждой команде, которую он посещает).
Итак, мой вопрос: как я могу показать роль пользователя в команде?
Я думал о:
$user->roles->where($team->id)
Но это возвращает все роли, которые прикреплены к пользователю, а не конкретную роль, которую пользователь имеет в команде.
Любая помощь приветствуется.
2 ответа
Спасибо @mrhn за ваш ценный вклад
Мое решение было в следующем виде:
$rolesInTeam[] = null;
$users = User::whereRoleIs($roles->pluck('name')->toArray(), $team)->get();
foreach ($users as $user){
$rolesInTeam[] = array_push($rolesInTeam,$user->roles()->wherePivotIn(Config::get('laratrust.foreign_keys.team'), $team)->get());
}
Что возвращается в результате:
null,
[
{
"id": 4,
"name": "leader",
"display_name": "Leader",
"description": "Leader",
"created_at": "2021-07-12T11:29:08.000000Z",
"updated_at": "2021-07-12T11:29:08.000000Z",
"pivot": {
"user_id": 1,
"role_id": 4,
"user_type": "App\\Models\\User"
}
}
],
2,
[
{
"id": 3,
"name": "user",
"display_name": "User",
"description": "User",
"created_at": "2021-07-12T11:29:08.000000Z",
"updated_at": "2021-07-12T11:29:08.000000Z",
"pivot": {
"user_id": 2,
"role_id": 3,
"user_type": "App\\Models\\User"
}
}
],
4,
[
{
"id": 3,
"name": "user",
"display_name": "User",
"description": "User",
"created_at": "2021-07-12T11:29:08.000000Z",
"updated_at": "2021-07-12T11:29:08.000000Z",
"pivot": {
"user_id": 5,
"role_id": 3,
"user_type": "App\\Models\\User"
}
}
],
6```
У меня нет опыта в Laratrust, но я чувствую, что у меня есть решение, которое вам нужно. Если мы взорвем исходный код , мы увидим ваш
UserTrait
включает ролевые отношения. Более того, мы видим, что он включает в себя стержень для
Team
модель.
if (Config::get('laratrust.teams.enabled')) {
$roles->withPivot(Config::get('laratrust.foreign_keys.team'));
}
В сочетании с методом
wherePivot()
что
Laravel
имеет, вы сможете выполнить следующее, извлекая роли пользователей для данной команды. Поэтому вы получите все роли, если используете условие, со способом
Laratrust
работает, ты можешь иметь несколько ролей.
$rolesInTeam = $user->roles()->wherePivot(Config::get('laratrust.foreign_keys.team'), $team)->get();