participants as $participant) { if (in_array('runner', $participant->roles)) { $runners[] = $participant; } } return $runners; } public function hasScoreboard() { return $this->type == 'signup-async'; } public function updatePlacement() { $runners = []; foreach ($this->participants as $p) { if ($p->isRunner()) { $p->score = 0; $runners[] = $p; } else { $p->updatePlacement(null, null); } } if (empty($runners)) { return; } foreach ($this->rounds as $round) { foreach ($runners as $p) { $result = $p->findResult($round); if ($result) { $p->score += $result->score; } } } usort($runners, [Participant::class, 'compareScore']); $reversed = array_reverse($runners); $placement = count($runners); $skipped = 0; $lastScore = $runners[0]->score; foreach ($runners as $p) { if ($p->score > $lastScore) { $placement -= $skipped; $skipped = 1; $lastScore = $p->score; } else { ++$skipped; } $p->updatePlacement($p->score, $placement); } } public function applications() { return $this->hasMany(Application::class); } public function participants() { return $this->hasMany(Participant::class); } public function protocols() { return $this->hasMany(Protocol::class)->orderBy('created_at', 'DESC'); } public function rounds() { return $this->hasMany(Round::class)->orderBy('number', 'DESC'); } protected $casts = [ 'accept_applications' => 'boolean', 'locked' => 'boolean', 'no_record' => 'boolean', 'show_numbers' => 'boolean', ]; }