with(['genres', 'actors', 'directors']); if ($q !== '') { $query->where('title', 'like', "%{$q}%"); } if ($genre !== '') { $ln = mb_strtolower($genre); $query->whereHas('genres', fn($q2) => $q2->whereRaw('lower(name) = ?', [$ln])); } if ($rating !== '') { $query->where('rating', $rating); } if ($yearMin !== null) { $query->where('year', '>=', $yearMin); } if ($yearMax !== null) { $query->where('year', '<=', $yearMax); } if ($actor !== '') { $ln = mb_strtolower($actor); $query->whereHas('actors', fn($q2) => $q2->whereRaw('lower(name) = ?', [$ln])); } if ($director !== '') { $ln = mb_strtolower($director); $query->whereHas('directors', fn($q2) => $q2->whereRaw('lower(name) = ?', [$ln])); } if ($studio !== '') { $ln = mb_strtolower($studio); $query->whereHas('studios', fn($q2) => $q2->whereRaw('lower(name) = ?', [$ln])); } // Sorting switch ($sort) { case 'title_desc': $query->orderBy('title', 'desc'); break; case 'newest': $query->orderBy('created_at', 'desc'); break; case 'oldest': $query->orderBy('created_at', 'asc'); break; case 'year_asc': $query->orderBy('year', 'asc'); break; case 'year_desc': $query->orderBy('year', 'desc'); break; case 'title_asc': default: $query->orderBy('title', 'asc'); break; } return $query->paginate($perPage); } }