model->newQuery(); // Apply filters if (!empty($filters['search'])) { $query->where(function($q) use ($filters) { $q->where('last_name', 'LIKE', "%{$filters['search']}%") ->orWhere('first_name', 'LIKE', "%{$filters['search']}%"); }); } // Apply date range filters if (!empty($filters['start_date'])) { $query->where('death_date', '>=', $filters['start_date']); } if (!empty($filters['end_date'])) { $query->where('death_date', '<=', $filters['end_date']); } // Apply sorting $sortBy = $filters['sort_by'] ?? 'created_at'; $sortOrder = $filters['sort_order'] ?? 'desc'; $query->orderBy($sortBy, $sortOrder); // Eager load related counts $query->withCount(['documents', 'interventions']); return $query->paginate($perPage); } /** * Find a deceased by ID * * @param int $id * @return Deceased */ public function findById(int $id): Deceased { return $this->find($id); } /** * Search deceased by name * * @param string $name * @return Collection */ public function searchByName(string $name): Collection { return $this->model->newQuery() ->where(function($query) use ($name) { $query->where('last_name', 'LIKE', "%{$name}%") ->orWhere('first_name', 'LIKE', "%{$name}%"); }) ->orderBy('last_name', 'asc') ->orderBy('first_name', 'asc') ->get(); } }