Laravel JetStream получает роль пользователя в методе ресурсов

#laravel

Вопрос:

Я использую Laravel Jetstream функцию команд и хочу получить список всех членов команды с их ролью.

следующий метод из JetStream может возвращать роль пользователя

 public function teamRole($team)
{

    if ($this->ownsTeam($team)) {
        return new OwnerRole;
    }

    if (! $this->belongsToTeam($team)) {
        return;
    }

    return Jetstream::findRole($team->users->where(
        'id', $this->id
    )->first()->membership->role);
 

}

Когда пользователь выбирает маршрут /teams/{team} , я хотел бы ответить именем всех членов команды вместе с их ролью в команде, поэтому я создал TeamResource следующее.

 class Team extends JsonResource
{

    public function toArray($request)
    {
    return [
        'id'            => $this->id,
        'user_id'       => $this->user_id,
        'owner_name'    => $this->owner->name,
        'owner_email'   => $this->owner->email,
        'name'          => $this->name,
        'personal_team' => $this->personal_team,
        'users'         => TeamMemberResource::collection($this->allUsers()),
        'created_at'    => $this->created_at,
        'updated_at'    => $this->updated_at,
    ];
    }
}
 

Ниже приводится моя TeamMemberResource модель, которая является User моделью

 class TeamMember extends JsonResource
{ 

    public function toArray($request)
    {
    return [
        'id'         => $this->id,
        'first_name' => $this->first_name,
        'last_name'  => $this->last_name,
        'role'       => //How do I get user's role in this team
        'name'       => $this->name,
        'email'      => $this->email,
        'active'     => $this->active,
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
    ];
    }
}
 

Отношений User у нее много Team .

TeamUser в таблице есть столбец role .

Как мне получить доступ к роли пользователя в данной команде?

Спасибо

Ответ №1:

Самый простой способ сделать это-определить отдельную модель для пользователя в определенной команде. Тогда вам не нужно будет выяснять, с какой командой вы имеете дело. Однако это, вероятно, выходит за рамки данного вопроса.

Предполагая, что вы хотите добиться этого с помощью моделей по умолчанию, вам нужно выяснить, как сообщить коллекции «член команды», с какой командой она имеет дело.

Начните с определения отдельного TeamMemberCollection ресурса. Переопределите ResourceCollection конструктор по умолчанию и передайте команду в качестве второго аргумента.

 class TeamMemberCollection extends ResourceCollection
{
    public $team;

    public function __construct($collection, $team)
    {
        $this->team = $team;
        parent::__construct($collection);
    }
}
 

Затем обновите TeamMember::toArray метод, чтобы принять команду, и TeamMemberCollection::toArray метод, чтобы передать команду.

 class TeamMember extends JsonResource
{
    public function toArray($request, $team)
    {
        return [
            // Other properties...
            'role' => $this->teamRole($team),
        ];
    }
}
 
 class TeamMemberCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return $this->collection
            ->map
            ->toArray($request, $this->team)
            ->all();
    }
}
 

Наконец, не забудьте обновить Team ресурс, чтобы передать команду TeamMemberCollection конструктору.

 class Team extends JsonResource
{
    public function toArray($request)
    {
        return [
            // Other properties...
            'users' => new TeamMemberCollection($this->allUsers(), $this),
        ];
    }
}