where('project_id', $project->id) ->findOrFail($linkedTicketId); [$sourceTicketId, $targetTicketId] = $this->normalizeTicketPair($ticket->id, $linkedTicket->id); return DB::transaction(function () use ($linkedTicket, $user, $ticketLinkTypeId, $sourceTicketId, $targetTicketId, $ticket): TicketLink { $ticketLink = TicketLink::query()->updateOrCreate( [ 'source_ticket_id' => $sourceTicketId, 'target_ticket_id' => $targetTicketId, ], [ 'ticket_link_type_id' => $ticketLinkTypeId, ], ); $ticketLink->load('ticketLinkType'); $this->createTicketWorklogEntry->handle( $ticket, $user, TicketWorklogEntryType::LinkUpdated, "Linked {$linkedTicket->ticket_key} as {$ticketLink->ticketLinkType->label}.", [ 'linked_ticket_key' => $linkedTicket->ticket_key, 'ticket_link_type' => $ticketLink->ticketLinkType->label, ], ); $this->createTicketWorklogEntry->handle( $linkedTicket, $user, TicketWorklogEntryType::LinkUpdated, "Linked {$ticket->ticket_key} as {$ticketLink->ticketLinkType->label}.", [ 'linked_ticket_key' => $ticket->ticket_key, 'ticket_link_type' => $ticketLink->ticketLinkType->label, ], ); return $ticketLink; }); } /** * @return array{0: int, 1: int} */ private function normalizeTicketPair(int $firstTicketId, int $secondTicketId): array { return [ min($firstTicketId, $secondTicketId), max($firstTicketId, $secondTicketId), ]; } }