validated(); // Используем eager loading (with), чтобы избежать проблемы N+1 $query = Gig::with('categories'); // Фильтрация по нескольким категориям (Many-to-Many) if (!empty($validated['categories'])) { $query->whereHas('categories', function ($q) use ($validated) { $q->whereIn('categories.id', $validated['categories']); }); } // Фильтрация по промежутку дат if (!empty($validated['date_from'])) { $query->where('event_date', '>=', Carbon::parse($validated['date_from'])->startOfDay()); } if (!empty($validated['date_to'])) { $query->where('event_date', '<=', Carbon::parse($validated['date_to'])->endOfDay()); } // Получаем per_page из валидированных данных, либо берем дефолт $per_page = $validated['per_page'] ?? self::PER_PAGE; // Сортируем события: сначала ближайшие $query->orderBy('event_date', 'asc'); // Пагинация $gigs = $query->paginate((int)$per_page); return GigResource::collection($gigs); } }