*/ protected $casts = [ 'registered_at' => 'datetime', 'checked_in_at' => 'datetime', 'answers_json' => 'array', ]; protected static function booted(): void { static::creating(function (self $row) { if (! filled($row->ticket_code)) { $row->ticket_code = self::newTicketCode(); } }); } public static function newTicketCode(): string { do { $code = bin2hex(random_bytes(8)); } while (self::query()->where('ticket_code', $code)->exists()); return $code; } public function competition(): BelongsTo { return $this->belongsTo(Competition::class); } public function session(): BelongsTo { return $this->belongsTo(AudienceSession::class, 'audience_session_id'); } public function user(): BelongsTo { return $this->belongsTo(User::class); } public function checkedInBy(): BelongsTo { return $this->belongsTo(AdminUser::class, 'checked_in_by_admin_id'); } public function checkedInByCompetitionAdmin(): BelongsTo { return $this->belongsTo(CompetitionAdmin::class, 'checked_in_by_competition_admin_id'); } public function isCheckedIn(): bool { return $this->checked_in_at !== null; } public static function existsForUserCompetition(int $userId, int $competitionId): bool { return static::query() ->where('user_id', $userId) ->where('competition_id', $competitionId) ->exists(); } }