Partage
  • Partager sur Facebook
  • Partager sur Twitter

Verifier si une ligne d'une table existe

    17 mai 2019 à 19:01:22

    Bonsoir,

    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?
    • Partager sur Facebook
    • Partager sur Twitter
      17 mai 2019 à 20:28:20

      Bonjour,

      On ne pourrait pas plutôt avoir la structures de toutes les tables avec leurs clés étrangères ? J'avoue ne pas avoir bien compris.

      • Partager sur Facebook
      • Partager sur Twitter
        17 mai 2019 à 23:51:22

        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 .
        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2019 à 7:55:49

          Donc tu devrais pouvoir faire une jointure externe : tes lignes "absentes" vont ressortir avec des "NULL" sur la table "reponse".
          • Partager sur Facebook
          • Partager sur Twitter
            19 mai 2019 à 0:10:55

            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?)

            • Partager sur Facebook
            • Partager sur Twitter
              20 mai 2019 à 0:23:36

              C'est bon j'ai trouvé :

              $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();

              Maintenant j'aimerais compter le nombre de NULL

              • Partager sur Facebook
              • Partager sur Twitter
                20 mai 2019 à 8:53:34

                Tu n'auras pas les NULL avec une jointure interne, il faut laisser le LEFT JOIN. Pour le reste ce n'est pas dur, tu fais un COUNT sur IS NULL.
                • Partager sur Facebook
                • Partager sur Twitter
                  20 mai 2019 à 16:57:53

                  philodick a écrit:

                  Tu n'auras pas les NULL avec une jointure interne, il faut laisser le LEFT JOIN. Pour le reste ce n'est pas dur, tu fais un COUNT sur IS NULL.

                  Super merci philodick, je vais revoir ça :)



                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 mai 2019 à 23:10:04

                    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 :

                     $repository = $this->getDoctrine()->getRepository(Proposition::class);
                    
                        $null = $repository->findAllNull();
                        dump($null);


                    Maintenant comment recuperer de cet array, cette satané valeur ?? :euh:

                    • Partager sur Facebook
                    • Partager sur Twitter

                    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.
                    • Editeur
                    • Markdown