hydrateTicketUsers($ticket); $ticket->loadMissing(['status', 'priority', 'category', 'project', 'team']); $actor?->loadMissing('company'); return strtr($template, [ '{{ ticket.reference }}' => $ticket->reference, '{{ ticket.subject }}' => $ticket->subject, '{{ ticket.status }}' => (string) ($ticket->status?->name ?? ''), '{{ ticket.priority }}' => (string) ($ticket->priority?->name ?? ''), '{{ ticket.category }}' => (string) ($ticket->category?->name ?? ''), '{{ ticket.project }}' => (string) ($ticket->project?->title ?? ''), '{{ ticket.team }}' => (string) ($ticket->team?->name ?? ''), '{{ requester.name }}' => (string) ($ticket->owner?->name ?? ''), '{{ agent.name }}' => (string) ($ticket->agent?->name ?? ''), '{{ actor.name }}' => (string) ($actor?->name ?? ''), '{{ ticket.url }}' => route('helpdesk.tickets.show', ['ticket' => $ticket->getKey()]), ]); } /** * Load requester/agent with one query if the caller has not already attached them. */ private function hydrateTicketUsers(Ticket $ticket): void { if ($ticket->relationLoaded('owner') && $ticket->relationLoaded('agent')) { return; } $userIds = collect([$ticket->user_id, $ticket->agent_id]) ->filter() ->map(static fn (mixed $id): int => (int) $id) ->unique() ->values(); if ($userIds->isEmpty()) { $ticket->setRelation('user', null); $ticket->setRelation('owner', null); $ticket->setRelation('agent', null); return; } $users = User::query() ->with('company') ->whereIn('id', $userIds) ->get() ->keyBy('id'); $owner = $users->get((int) $ticket->user_id); $agent = $ticket->agent_id === null ? null : $users->get((int) $ticket->agent_id); $ticket->setRelation('user', $owner); $ticket->setRelation('owner', $owner); $ticket->setRelation('agent', $agent); } }