id.'-'.$mode.'-'.$sort; return Cache::remember($cacheKey, 10, function () use ($audition, $mode, $sort) { $this->validateAudition($audition); $this->validateMode($mode); $this->validateSort($sort); $sortColumn = match ($sort) { 'tiebreak' => 'tiebreak_order', 'display' => 'display_order', }; $modeColumn = match ($mode) { 'seating' => 'for_seating', 'advancement' => 'for_advance', }; return $audition->scoringGuide->subscores->where($modeColumn, true)->sortBy($sortColumn); }); } public function getJudges(Audition $audition) { $cacheKey = 'auditionJudges-'.$audition->id; return Cache::remember($cacheKey, 10, function () use ($audition) { $this->validateAudition($audition); return $audition->judges; }); } protected function validateAudition($audition) { if (! $audition->exists()) { throw new AuditionServiceException('Invalid audition provided'); } } protected function validateMode($mode) { if ($mode !== 'seating' && $mode !== 'advancement') { throw new AuditionServiceException('Invalid mode requested. Mode must be seating or advancement'); } } protected function validateSort($sort) { if ($sort !== 'tiebreak' && $sort !== 'display') { throw new AuditionServiceException('Invalid sort requested. Sort must be tiebreak or weight'); } } public function auditionExists($audition) { return self::$allAuditionIds->contains($audition->id); } }