Через умовні методи ресурсу - вони не роблять запитів самі, а лише перевіряють, що вже завантажено.
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'author' => new UserResource($this->whenLoaded('author')),
'comments_count' => $this->whenCounted('comments'),
'is_featured' => $this->when($request->user()?->isEditor(), $this->is_featured),
$this->mergeWhen($request->user()?->isAdmin(), [
'internal_notes' => $this->internal_notes,
]),
];
}
whenLoaded('author')- поле з'явиться, лише якщо контролер зробивwith('author');whenCounted('comments')- післяwithCount('comments');when($condition, $value)- поле зникає з відповіді зовсім, якщо умова хибна;mergeWhen()- кілька полів за однією умовою.
Навіщо так: контролер вирішує, що завантажити для конкретного ендпойнта, а ресурс просто відображає. Без whenLoaded звернення $this->author в ресурсі робить запит на кожен елемент колекції - класичне N+1.
Права й приховані поля: when() з перевіркою ролі не дає віддати внутрішні поля звичайному клієнту - корисніше, ніж $hidden у моделі, бо залежить від того, хто питає.