Construction du questionnaire template : Résumé du Cheminement et du Choix Final
Cheminement des Solutions Envisagées
L'objectif initial était de charger l'arbre complet d'un questionnaire Symfony/Doctrine pour l'affichage, tout en gérant l'ordre logique des questions (parent avant enfant) et en évitant la redondance dans la sortie JSON.
-
Tentative Initiale (Chargement Eager Massif en 1 requête) : La première approche consistait à utiliser une seule requête DQL (
LEFT JOINetaddSelectmultiples) pour charger l'arbre complet (QuestionnaireTemplateavec toutes ses relations :Question,PossibleAnswer,Transition).- Problème : Cette méthode conduit à des requêtes SQL très lourdes et gourmandes en mémoire pour l'hydratation PHP d'un grand nombre d'objets (surtout pour les questionnaires complexes), tout en générant une forte redondance dans le JSON de sortie.
-
Affinement par Sérialisation : Nous avons résolu la redondance du JSON en utilisant les Groupes de Sérialisation (
#[Groups]) pour exclure la liste plate des questions à la racine et en gérant les références circulaires/multiples via un Circular Reference Handler.- Limitation : Cette solution ne résolvait pas le problème de l'ordre logique des questions (parent avant enfant), car la sérialisation est un problème de formatage et non d'ordonnancement.
-
Introduction du Tri Topologique : L'Algorithme de Kahn (Tri Topologique) a été identifié comme la méthode nécessaire pour ordonner un Graphe Orienté Acyclique (DAG), ce qui est la nature de la structure de votre questionnaire.
Choix Final (Solution Hybride Optimisée)
La solution retenue combine l'efficacité du fetching de données avec la puissance de la logique métier PHP :
La conception repose sur une séparation des tâches pour garantir la performance sur les questionnaires complexes :
- Récupération des Données (Repository) : Utiliser deux requêtes SQL optimisées pour récupérer les données, ce qui est plus efficace que d'essayer de tout joindre en une seule requête massive.
- Requête 1 : Récupérer la liste plate des entités Question et leurs PossibleAnswers.
- Requête 2 : Récupérer la liste plate des Transitions (liens) en utilisant l'hydratation en tableau pour obtenir uniquement les IDs (source/destination) nécessaires au tri de Kahn, minimisant la charge mémoire.
- Ordonnancement (Service de Tri Topologique) : Appliquer l'Algorithme de Kahn en PHP pour assembler les données et retourner une liste plate ordonnée d'objets
Question. - Sortie des Données (Sérialisation) : Sérialiser la liste ordonnée finale, garantissant une sortie JSON propre, structurée dans l'ordre logique et sans redondance.