You are relying unnecessarily on an extra piece of data (status) to determine the active state of an Event; you already represent this state with the dates starts_at and ends _at.
You can use an Eloquent Query Scope to fetch active Events:
public function scopeActive(Builder $builder)
{
$builder->whereDate('starts_at', '<=', today())->whereDate('ends_at', '>=', today());
}
and you can represent the status on the model with an Accessor:
public function active(): Attribute
{
return new Attribute(
get: fn () => $this->starts_at <= today() && $this->ends_at >= today()
);
}
The alternative is to create a scheduled task to check every record in the table, and update the status when the condition is satisfied. Again, IMHO this is unnecessary.