Files
DEV/SAE2.02_Application_WEB/application/models/Model_tvshow.php
2025-12-05 10:30:43 +01:00

258 lines
7.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Model_tvshow extends CI_Model
{
public function __construct()
{
parent::__construct();
$this->load->database();
}
/** Toutes les séries + poster + nb de saisons */
public function getTvshows()
{
$sql = "
SELECT tvshow.id,
tvshow.name,
poster.jpeg,
(
SELECT COUNT(*)
FROM season
WHERE season.tvShowId = tvshow.id
AND season.seasonNumber != 2147483647
) AS seasons_count
FROM tvshow
JOIN poster ON poster.id = tvshow.posterId
";
return $this->db->query($sql)->result();
}
/** Suggestions basées sur les genres en commun */
public function getSuggestionsByTvshowId($tvshowId)
{
$sql = "
SELECT ts.id,
ts.name,
p.jpeg,
COUNT(DISTINCT tsg1.genreId) AS common_genres,
COUNT(DISTINCT s.id) AS seasons_count
FROM tvshow ts
JOIN poster p ON p.id = ts.posterId
JOIN tvshow_genre tsg1 ON tsg1.tvShowId = ts.id
JOIN tvshow_genre tsg2 ON tsg2.genreId = tsg1.genreId
LEFT JOIN season s ON s.tvShowId = ts.id
WHERE tsg2.tvShowId = ?
AND ts.id != ?
GROUP BY ts.id, ts.name, p.jpeg
ORDER BY common_genres DESC, ts.name
LIMIT 8
";
return $this->db->query($sql, [$tvshowId, $tvshowId])->result();
}
/** Une série par son id */
public function getTvshowById($id)
{
$sql = "
SELECT tvshow.*, poster.jpeg
FROM tvshow
JOIN poster ON poster.id = tvshow.posterId
WHERE tvshow.id = ?
";
return $this->db->query($sql, [$id])->row();
}
/** Homepage d'une série */
public function getHomepageById($id)
{
$sql = "
SELECT homepage
FROM tvshow
WHERE id = ?
";
$query = $this->db->query($sql, [$id]);
return $query->row() ? $query->row()->homepage : null;
}
/** Tous les épisodes dune série, triés par saison puis numéro dépisode */
public function getEpisodesByTvshowId($tvShowId)
{
$sql = "
SELECT season.seasonNumber AS season_number,
episode.episodeNumber AS episode_number,
episode.name AS episode_name,
episode.overview AS episode_overview
FROM season
JOIN episode ON episode.seasonId = season.id
WHERE season.tvShowId = ?
ORDER BY season.seasonNumber ASC, episode.episodeNumber ASC
";
return $this->db->query($sql, [$tvShowId])->result();
}
/** Toutes les séries d'un genre donné */
public function getTvshowsByGenre($genre)
{
$sql = "
SELECT tvshow.id,
tvshow.name,
poster.jpeg,
(
SELECT COUNT(*)
FROM season
WHERE season.tvShowId = tvshow.id
AND season.seasonNumber != 2147483647
) AS seasons_count
FROM tvshow
JOIN poster ON poster.id = tvshow.posterId
JOIN tvshow_genre ON tvshow_genre.tvShowId = tvshow.id
JOIN genre ON genre.id = tvshow_genre.genreId
WHERE genre.name = ?
AND EXISTS (
SELECT 1 FROM season
WHERE season.tvShowId = tvshow.id
AND season.seasonNumber != 2147483647
)
";
return $this->db->query($sql, [$genre])->result();
}
public function getAllFiltered($genre = null, $search = null, $order_by = null, $min_rating = null)
{
$sql = "
SELECT
tvshow.id,
tvshow.name,
tvshow.overview,
tvshow.homepage,
poster.jpeg,
AVG(critiques.note) AS average_rating,
COUNT(DISTINCT season.id) AS seasons_count
FROM tvshow
JOIN poster ON poster.id = tvshow.posterId
LEFT JOIN tvshow_genre ON tvshow_genre.tvShowId = tvshow.id
LEFT JOIN genre ON genre.id = tvshow_genre.genreId
LEFT JOIN critiques ON critiques.tvshow_id = tvshow.id
LEFT JOIN season ON season.tvShowId = tvshow.id
";
$conditions = [];
$params = [];
if ($genre) {
$conditions[] = "genre.name = ?";
$params[] = $genre;
}
if ($search) {
$conditions[] = "tvshow.name LIKE ?";
$params[] = '%' . $search . '%';
}
if (!empty($conditions)) {
$sql .= " WHERE " . implode(" AND ", $conditions);
}
$sql .= " GROUP BY tvshow.id";
if ($min_rating) {
$sql .= " HAVING average_rating >= ?";
$params[] = $min_rating;
}
if ($order_by) {
foreach ($order_by as $column => $direction) {
$sql .= " ORDER BY $column $direction";
break;
}
}
return $this->db->query($sql, $params)->result();
}
/** Tous les genres associés à une série */
public function getGenresByTvshowId($tvshowId)
{
$sql = "
SELECT genre.name
FROM genre
JOIN tvshow_genre ON tvshow_genre.genreId = genre.id
WHERE tvshow_genre.tvShowId = ?
ORDER BY genre.name
";
return $this->db->query($sql, [$tvshowId])->result();
}
/** Tous les genres disponibles */
public function getAllGenres()
{
$sql = "
SELECT name
FROM genre
ORDER BY name
";
return $this->db->query($sql)->result();
}
/** Recherche de séries par nom, avec filtre optionnel par genre */
public function searchTvshows($query, $genre = null)
{
$sql = "
SELECT tvshow.id,
tvshow.name,
poster.jpeg,
(
SELECT COUNT(*)
FROM season
WHERE season.tvShowId = tvshow.id
) AS seasons_count
FROM tvshow
JOIN poster ON poster.id = tvshow.posterId
WHERE tvshow.name LIKE ?
";
$params = ['%' . $query . '%'];
if (!empty($genre)) {
$sql .= "
AND tvshow.id IN (
SELECT tvshow_genre.tvShowId
FROM tvshow_genre
JOIN genre ON genre.id = tvshow_genre.genreId
WHERE genre.name = ?
)
";
$params[] = $genre;
}
return $this->db->query($sql, $params)->result();
}
/** Récupère une saison précise par série et numéro */
public function getSeasonByNumber($tvshow_id, $season_number)
{
$sql = "
SELECT season.*, poster.jpeg
FROM season
LEFT JOIN poster ON poster.id = season.posterId
WHERE season.tvShowId = ? AND season.seasonNumber = ?
LIMIT 1
";
return $this->db->query($sql, [$tvshow_id, $season_number])->row();
}
/** Récupère les épisodes dune saison spécifique */
public function getEpisodesBySeason($tvshow_id, $season_number)
{
$sql = "
SELECT episode.episodeNumber, episode.name, episode.overview
FROM episode
JOIN season ON season.id = episode.seasonId
WHERE season.tvShowId = ? AND season.seasonNumber = ?
ORDER BY episode.episodeNumber
";
return $this->db->query($sql, [$tvshow_id, $season_number])->result();
}
}