find($id); if (!$genre) { throw (new ModelNotFoundException())->setModel(Genre::class, [$id]); } $perPage = max(1, min((int)($params['per_page'] ?? 20), 50)); $q = isset($params['q']) ? trim((string)$params['q']) : ''; $sort = isset($params['sort']) ? trim((string)$params['sort']) : 'title_asc'; $moviesQuery = Movie::query() ->whereHas('genres', fn($q2) => $q2->whereKey($genre->id)) ->with(['genres']) ->when($q !== '', fn($query) => $query->where('title', 'like', "%{$q}%")); switch ($sort) { case 'title_desc': $moviesQuery->orderBy('title', 'desc'); break; case 'newest': $moviesQuery->orderBy('created_at', 'desc'); break; case 'oldest': $moviesQuery->orderBy('created_at', 'asc'); break; case 'year_asc': $moviesQuery->orderBy('year', 'asc'); break; case 'year_desc': $moviesQuery->orderBy('year', 'desc'); break; case 'title_asc': default: $moviesQuery->orderBy('title', 'asc'); break; } $movies = $moviesQuery->paginate($perPage); return [ 'entity' => $genre, 'movies' => $movies, ]; } }