searcg revamp 😧

This commit is contained in:
Lars Behrends
2025-11-06 13:39:46 +01:00
parent a44c311e89
commit 0f0fb3b410
8 changed files with 1526 additions and 144 deletions

View File

@@ -176,4 +176,132 @@ class Actor extends Model
'adult_video_id' => $adultVideoId
]);
}
/**
* Get paginated actors with optional search and sorting
*/
public function getPaginated(PDO $pdo, int $page = 1, int $perPage = 20, string $search = '', string $sort = 'name_asc'): array
{
$offset = ($page - 1) * $perPage;
// Build WHERE clause for search
$whereClause = '';
$params = [];
if (!empty($search)) {
$whereClause = 'WHERE name LIKE :search';
$params['search'] = '%' . $search . '%';
}
// Build ORDER BY clause
$orderBy = match ($sort) {
'name_desc' => 'name DESC',
'media_desc' => '(SELECT COUNT(*) FROM actor_movie WHERE actor_id = actors.id) + (SELECT COUNT(*) FROM actor_tv_show WHERE actor_id = actors.id) + (SELECT COUNT(*) FROM actor_adult_video WHERE actor_id = actors.id) DESC',
'media_asc' => '(SELECT COUNT(*) FROM actor_movie WHERE actor_id = actors.id) + (SELECT COUNT(*) FROM actor_tv_show WHERE actor_id = actors.id) + (SELECT COUNT(*) FROM actor_adult_video WHERE actor_id = actors.id) ASC',
default => 'name ASC'
};
// Get actors with their media counts
$stmt = $pdo->prepare("
SELECT
a.*,
(SELECT COUNT(*) FROM actor_movie WHERE actor_id = a.id) as movie_count,
(SELECT COUNT(*) FROM actor_tv_show WHERE actor_id = a.id) as tv_show_count,
(SELECT COUNT(*) FROM actor_adult_video WHERE actor_id = a.id) as adult_video_count
FROM actors a
{$whereClause}
ORDER BY {$orderBy}
LIMIT :limit OFFSET :offset
");
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
foreach ($params as $key => $value) {
$stmt->bindValue(':' . $key, $value);
}
$stmt->execute();
$actors = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Add relationships data for each actor
foreach ($actors as &$actor) {
$actor['movies'] = $this->getActorMovies($actor['id']);
$actor['tvShows'] = $this->getActorTvShows($actor['id']);
$actor['adultVideos'] = $this->getActorAdultVideos($actor['id']);
}
return $actors;
}
/**
* Get total count of actors with optional search
*/
public function getTotalCount(PDO $pdo, string $search = ''): int
{
$whereClause = '';
$params = [];
if (!empty($search)) {
$whereClause = 'WHERE name LIKE :search';
$params['search'] = '%' . $search . '%';
}
$stmt = $pdo->prepare("SELECT COUNT(*) as count FROM actors {$whereClause}");
foreach ($params as $key => $value) {
$stmt->bindValue(':' . $key, $value);
}
$stmt->execute();
return (int)$stmt->fetch(PDO::FETCH_ASSOC)['count'];
}
/**
* Get movies for a specific actor (helper method)
*/
private function getActorMovies(int $actorId): array
{
$stmt = $this->pdo->prepare("
SELECT m.id, m.title
FROM movies m
JOIN actor_movie am ON m.id = am.movie_id
WHERE am.actor_id = ?
ORDER BY m.title
");
$stmt->execute([$actorId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
/**
* Get TV shows for a specific actor (helper method)
*/
private function getActorTvShows(int $actorId): array
{
$stmt = $this->pdo->prepare("
SELECT ts.id, ts.title
FROM tv_shows ts
JOIN actor_tv_show ats ON ts.id = ats.tv_show_id
WHERE ats.actor_id = ?
ORDER BY ts.title
");
$stmt->execute([$actorId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
/**
* Get adult videos for a specific actor (helper method)
*/
private function getActorAdultVideos(int $actorId): array
{
$stmt = $this->pdo->prepare("
SELECT av.id, av.title
FROM adult_videos av
JOIN actor_adult_video aav ON av.id = aav.adult_video_id
WHERE aav.actor_id = ?
ORDER BY av.title
");
$stmt->execute([$actorId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}