#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),
];
}
}