Voilà je souhaiterais comparer 2 tables : Proposition et Reponse . en fait Proposition correspond aux différentes propositions pour une question donnée (systeme QCM). Reponse est une table créée à partire des propositions cochées par l'utilisateur. Mon but ici est de vérifier si les lignes de propositions avec le champ "vrai" = 1 (bonnes reponses) sont toutes présentes dans la table Reponse (sinon -1 à chaque manquement) . Ma table Proposition a les champs suivant id, question_id, vrai etc.. ma table Reponse quant à elle reprend question_id, proposition_id ... Comment construire la requête?
Je vais essayer d'être plus clair : mon code génère un form de type QCM, qui reprend un certain nombre de questions auxquelles sont associés des propositions (Question et Proposition sont 2 entités avec une relation onToMany) ... une fois le qcm coché et validé, une table Reponse vient stocker toutes les cases coché (Reponse : id, id_proposition, id_question) . Maintenant l'idée est de prendre chaque ligne de Proposition(id, choix... c'est le text de la proposition, vrai...=1 si proposition n'est pas un leurre, et id_question) pour chaque id_question et de vérifier son existence dans Reponse : si cette ligne est absente alors cela signifie que l'utilisateur n'a pas coché toutes les bonnes réponse .
Effectivement avec un left join, j'ai le resultat escompté : j'ai fait le test sur phpMyAdmin. Maintenant le problème est de traduire cette requete sur doctrine. Dans le Repository de Proposition j'ai essayé ça (pour la 1ere étape):
public function findAllNull(): array
{
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
" SELECT *
FROM App\Entity\Proposition
LEFT JOIN App\Entity\Reponse
ON proposition.id = reponse.id_proposition
WHERE proposition.vrai = '1' ");
// returns an array of Product objects
return $query->execute();
}
Bien entendu j'obtiens une erreur que je n'arrive pas à dechiffrer : [Syntax Error] line 0, col 8: Error: Expected IdentificationVariable | ScalarExpression | AggregateExpression | FunctionDeclaration | PartialObjectExpression | "(" Subselect ")" | CaseExpression, got '*'
Par ailleurs je précise que j'ai construit Reponse sans relation avec Proposition (dans le cas d'une requete join faite à partir d'un Repository donné, la 2eme table doit elle avoir une relation avec la 1ere?)
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
" SELECT p
FROM App\Entity\Proposition p
JOIN App\Entity\Reponse r
WITH p.id = r.idProposition
WHERE p.vrai = '1' ");
// returns an array of Product objects
return $query->execute();
C'est bon j'ai pu faire la requête de decompte des NULL :
public function findAllNull()//:array
{
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
"SELECT COUNT (p)
FROM App\Entity\Proposition p
LEFT JOIN App\Entity\Reponse r
WITH p.id=r.idProposition
WHERE p.vrai = '1' AND r.idProposition IS NULL");
// returns an array of Product objects
return $query->execute();
}
Seulement voilà le resultat retourné est un tableau dans lequel effectivement se trouve la "valeur" du nombre de NULL, en faisant un dump depuis mon controller :
Maintenant comment recuperer de cet array, cette satané valeur ??
Verifier si une ligne d'une table existe
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.