$query * @param array{username?: string, email?: string, payment_status?: string, invoice_status?: string, start_date?: string, end_date?: string} $filters * @return Builder */ public function scopeFilter(Builder $query, array $filters): Builder { if (! empty($filters['username'])) { $query->where('username', 'like', '%'.$filters['username'].'%'); } if (! empty($filters['email'])) { $query->where('email', 'like', '%'.$filters['email'].'%'); } if (! empty($filters['payment_status'])) { $query->where('payment_status', $filters['payment_status']); } if (! empty($filters['invoice_status'])) { if ($filters['invoice_status'] === self::INVOICE_STATUS_PENDING) { $query->where(function (Builder $q): void { $q->whereNull('invoice_status') ->orWhere('invoice_status', self::INVOICE_STATUS_PENDING); }); } else { $query->where('invoice_status', $filters['invoice_status']); } } if (! empty($filters['start_date'])) { try { $query->where('created_at', '>=', Carbon::parse($filters['start_date'])->startOfDay()); } catch (\Exception) { // ignore invalid date input } } if (! empty($filters['end_date'])) { try { $query->where('created_at', '<=', Carbon::parse($filters['end_date'])->endOfDay()); } catch (\Exception) { // ignore invalid date input } } return $query; } }