【问题标题】:Laravel JetStream get HasRole of user in resource methodLaravel JetStream 在资源方法中获取用户的 HasRole
【发布时间】:2021-06-01 20:52:27
【问题描述】:

我正在使用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,
    ];
    }
}

下面是我的TeamMemberResourceUser 模型

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 列。

如何访问给定团队中用户的角色?

谢谢

【问题讨论】:

    标签: laravel


    【解决方案1】:

    做到这一点的最巧妙方法是为特定团队中的用户定义一个单独的模型。然后,您不必弄清楚您正在与哪个团队打交道。不过,这可能超出了这个问题的范围。

    假设您想使用默认模型实现这一点,您需要弄清楚如何告诉“团队成员”集合它正在处理哪个团队。

    首先定义a separate TeamMemberCollection resource。覆盖默认的 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),
            ];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-07
      • 2021-09-21
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 2022-12-02
      • 2020-11-19
      • 2021-12-30
      • 2021-03-27
      相关资源
      最近更新 更多