Bonjour,

Avant toute chose, je précise que suis uniquement autodidacte et n'ai pas trouvé d'informations précises (ni reçu de formation à ce sujet) ou n'ai pas su en chercher.

Je développe un site avec la base de données MySQL du logiciel Kodi dont la structure est visible sur https://kodi.wiki/view/Databases/MyVideos (je vous invite à aller y jeter un coup d'oeil pour comprendre mon problème...)

Les tables étant déjà établies, je n'ai pas voulu les modifier pour rajouter des champs qui me manquaient et mettre le bordel dans le logiciel...

Je souhaite utiliser des slugs pour gérer les urls et ai donc des tables annexes pour gérer les informations manquantes.

Le code est géré par 2 services, un pour les films, l'autres pour les séries TV et je ne souhaite pas utiliser les Entity de Doctrine et gère seulement des DTO correctement décorés (je crois que c'est le terme utilisé) via la connexion de Doctrine, tout marche bien à ce niveau.

Les DTO sont de simples classes qui précisent leur table de base de données et des proprités avec un nom plus sympa (comme title à la place de c00) , une methode hydrate transforme un tableau associatif issue de la connexion de Doctrine dans les proprités de ces DTO les modifiants au passage (traitement sur la forme, valeurs par défaut...)

Ce que je fais

Via la classe movieService, j'ai le code suivant pour un film :

        return $this->queryService
                    ->findBySlug($slug)
                    ->withCountries()
                    ->withGenres()
                    ->withStudios()
                    ->withActors()
                    ->withDirectors()
                    ->withWriters()
                    ->getModel();

qui me premet d'avoir la requête :

SELECT movie.idMovie AS id, movie.c00 AS title, movie.c01 AS plot, movie.c03 AS tagline, movie.c11 AS runtime, movie.c12 AS mpaa, movie.premiered AS aired, movie.c00 AS title, movie.c01 AS plot, movie.c03 AS tagline, movie.c11 AS runtime, movie.c12 AS mpaa, movie.premiered AS aired, info.dateAdded AS updated, extra.value AS tmdb_id, poster.url as poster, fanart.url as fanart, rating.rating as note, rating.votes as votes, meta.* FROM movie JOIN files info ON (info.idFile = movie.idFile)JOIN uniqueid extra ON (extra.uniqueid_id = movie.c09) LEFT JOIN art poster ON (poster.media_id = movie.idMovie AND poster.media_type = 'movie' AND poster.type = 'poster') LEFT JOIN art fanart ON (fanart.media_id = movie.idMovie AND fanart.media_type = 'movie' AND fanart.type = 'fanart') LEFT JOIN rating ON (rating.media_id = movie.idMovie AND rating.media_type = 'movie') LEFT JOIN app_movie_meta meta ON (meta.idMovie = movie.idMovie) WHERE meta.slug = '87-piege-en-haute-mer';

et via la classe tvshowService, le code suivant pour une série :

        return $this->queryService
                    ->findBySlug($slug)
                    ->withGenres()
                    ->withStudios()
                    ->withActors()
                    ->getModel();

qui me premet d'avoir la requête :

SELECT tvshow.idShow AS id, tvshow.c00 AS title, tvshow.c01 AS plot, tvshow.c02 AS situation, tvshow.c13 AS mpaa, tvshow.c05 AS aired, tvshow.c00 AS title, tvshow.c01 AS plot, tvshow.c02 AS situation, tvshow.c13 AS mpaa, tvshow.c05 AS aired, info.dateAdded AS updated, info.totalSeasons AS seasons_count, info.totalCount AS episodes_count, extra.value AS tmdb_id, poster.url as poster, fanart.url as fanart, rating.rating as note, rating.votes as votes, meta.* FROM tvshow JOIN tvshowcounts info ON (info.idShow = tvshow.idShow) JOIN uniqueid extra ON (extra.uniqueid_id = tvshow.c12) LEFT JOIN art poster ON (poster.media_id = tvshow.idShow AND poster.media_type = 'tvshow' AND poster.type = 'poster') LEFT JOIN art fanart ON (fanart.media_id = tvshow.idShow AND fanart.media_type = 'tvshow' AND fanart.type = 'fanart') LEFT JOIN rating ON (rating.media_id = tvshow.idShow AND rating.media_type = 'tvshow') LEFT JOIN app_tvshow_meta meta ON (meta.idShow = tvshow.idShow) WHERE meta.slug = '43-engrenages';

Une série n'a ni pays, ni réalisateur et pas de scénariste, seuls les épisodes de cette série en ont (sans le pays toute fois), voilà pour les présentations...

Une classe queryService gère la partie requête via les méthodes withCountries(), withGenres() et withStudios() par exemple qui me simplifie l'écriture du code.

Maintenant, le problème est que je voudrais coder la partie personnalité pour avoir sa filmographie composée de films et de séries (avec des activiés de réalisateurs et de scénaristes).

Une "joile" (j'en suis pas sûr mais ça marche :)) requête du style :

SELECT al.media_id AS played, 0 AS directed, 0 AS writen, al.media_type, al.role FROM actor_link al WHERE (al.actor_id = 47162 AND al.media_type != 'episode')
UNION ALL
SELECT 0 AS played, dl.media_id AS directed, 0 AS writen, dl.media_type, '' AS role FROM director_link dl WHERE (dl.actor_id = 47162 AND dl.media_type != 'episode')
UNION ALL
SELECT 0 AS played, 0 AS directed, wl.media_id AS writen, wl.media_type, '' AS role FROM writer_link wl WHERE (wl.actor_id = 47162 AND wl.media_type != 'episode')
LIMIT 50 

me retourne par exemple :
+----------+--------------+-----------+-------------------+-------------------------------+
| played | directed | writen | media_type | role |
+----------+--------------+-----------+-------------------+-------------------------------+
| 505 | 0 | 0 | movie | Richard Bullit |
| 3320 | 0 | 0 | movie | Paolo |
| 508 | 0 | 0 | tvshow | Philippe Rickwaert |
| 0 | 3320 | 0 | movie | |
| 0 | 0 | 3320 | movie | |
+----------+--------------+-----------+-------------------+-------------------------------+
Désolé la table semble bien écrite mais est mal rendue :(

Là, je suis au niveau de la classe queryService et je vais avoir besoin du routeur.

Où dois-je mettre le traitement des données exactement (leur décoration) ?

Dans la classe queryService ? Dans les movieService et tvshowService ?

Dois-je créé une classe dédiée à la décoration, vu qu'une partie déja est gérée la classe queryService ?

Quels noms donner à ces classes et leur espace de noms ?

Il y a t'il des informations sur le sujet ? (méthode de travail ? Site web ? Livre ?)

Désolé pour la longueur du message dû à l'exposé le plus clair possible de mon problème.

Merci d'avance pour toute l'aide que vous voudrez bien m'apporter...

1 réponse


tamplan
Auteur

Bonsoir,

En fait, j'ai grandement chamboulé mon code.

Je fais maintenant plusieurs longues requêtes avec des UNION pour me faciliter le travail et le traitement des données.

J'utilise des traits pour la même classe pour séparer mes différentes méthodes : FilterTrait pour les filtres paus, genres et studios, DecoratorTrait pour récupérer les images, ElementTrait pour les méthodes ne retournant qu'un seul élément et CollectionTrait pour les méthodes qui retournent plusieurs éléments sous la forme d'un tableau.

Est-ce mal ou sale de procéder ainsi ? :-)

Le questionnement sur le nom des classes reste malheureusement d'actualité...

Merci d'avance pour toute l'aide que vous pourrez m'apporter !