IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[Symfony 2] : QueryBuilder mettre une condition


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut [Symfony 2] : QueryBuilder mettre une condition
    Bonjour,

    J'ai un formulaire de recherche qui se compose de deux champs avec obligation de saisie et deux autres champs qui ne sont pas obligatoire.

    Lorsque je soumet mon formulaire, une fonction javascript récupère les valeurs du formulaire pour les envoyer à mon contrôleur .

    Ma fonction Javascript
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    function showResultat() {
    /* Champs OBLIGATOIRE*/
    var champs1 = document.getElementsById("champs1").value;
    var champs2  = document.getElementsById("champs2").value;
    /* Champs NON OBLIGATOIRE*/
    var champs3= document.getElementsById("champs3").value;
    var champs4= document.getElementsById("champs4").value;
     
    $.ajax({
        type: "GET",
        url: "{{ path('monControleur') }}",
        data: {'champs1 ': champs1 , 'champs2': champs2 , 'champs3':champs1, 'champs4':champs4},
        cache: false,
        success: function (data) {
            $('#resultat').html(data);
        }
        });
        return false;
        }
    L'action de mon contrôleur chargé de récupérer les valeurs saisie afin de les envoyer à ma fonction présente dans mon repository.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public function showResultatAction(Request $request){
     
        if ($request->isXmlHttpRequest()) {
     
            // Champs OBLIGATOIRE
            $champs1 = $request->query->get('champs1');
            $champs2 = $request->query->get('2');
     
        // Champs NON OBLIGATOIRE
        $champs3 = $request->query->get('champs3');
        $champs4 = $request->query->get('champs4');
     
            $em = $this->getDoctrine()->getManager();
            $listeGroupe = $em->getRepository('MainBundle:PqtDetails')->getListeGroupe($champs1,$champs2,$champs3,$champs4);
            ...
            }
            ...
    }
    Ma fonction présente dans mon repository

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public function getListeGroupe($champs1,$champs2,$champs3,$champs4){
     
    $results = $this->_em->createQuery('
        SELECT p.champs1, p.champs2
        FROM MainBundle:PqtDetails p
     
        WHERE p.champs1 = :champs1
        AND (p.champs2 >= :champs2
        AND p.champs3 <= :champs3)
        AND  p.champs4 is not null
    ')
        ->setParameters(array('champs1'=>$champs1, 'champs2'=>$champs2,'champs3'=>$champs3,'champs4'=>$champs4))
        ->getResult();
        return $results;
    }
    Je voudrais mettre une condition dans ma requête qui dit , si le champs3 et champs4 sont vide alors j’exécute ma requête seulement avec les champs1 et champs2 en paramètre, sinon ma requête s’exécute avec tous les champs en paramètre.

    Merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    bonjour,

    il te faut construire la requête dynamiquement en fonction des paramètres reçus c-a-d construire la requête en fonction de la présence ou non des champs3 et champs4:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
        /**
         * @param $champs1
         * @param $champs2
         * @param null $champs3
         * @param null $champs4
         * @return array
         */
        public function getListeGroupe($champs1, $champs2, $champs3 = null, $champs4 = null)  {
     
            $query = '
            SELECT p.champs1, p.champs2
             FROM MainBundle:PqtDetails p
             WHERE p.champs1 = :champs1
             AND   p.champs2 >= :champs2
            ';
     
            $params = ['champs1'=>$champs1, 'champs2'=>$champs2 ];
     
            if( $champs3 && $champs4 ){
                $params['champs3'] = $champs3;
                $params['champs4'] = $champs4;
                $query.=' AND p.champs3 <= :champs3 AND  p.champs4 is not null';
            }
     
     
            $results = $this->_em->createQuery( $query )
                ->setParameters( $params )
                ->getResult();
            return $results;
        }
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    Merci pour ton retour,

    J'ai suivi ton conseil.

    Avec les champs non obligatoire remplis ca marche pas de souci.

    Par contre lorsque les champs non obligatoire ne sont pas rempli j'ai le message d'erreur suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invalid parameter number: number of bound variables does not match number of tokens

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    le nom de ton paramètre est nommé champs2 et non 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            $champs2 = $request->query->get('2');
    dans tous les cas il faut absolument vérifier que chacune des variables reçues est bel et bien définie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
           if( !empty($request->query->get('champs1') )  )
              $champs1 = trim($request->query->get('champs1'));
     
           if( !empty($request->query->get('champs2') )  )
              $champs2 = trim($request->query->get('champs2'));
     
          if( !empty($request->query->get('champs3') )  )
              $champs3 = trim($request->query->get('champs3'));
     
          if( !empty($request->query->get('champs4') )  )
              $champs4 = trim($request->query->get('champs4'));

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    Il s'agissait d'une faute de frappe, j'ai bien mis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $champs2 = $request->query->get('champs2');
    J'ai bien testé que chacune de mes variables reçues est bel et bien définie.

    Lorsque je ne saisies pas les deux champs non obligatoire (champs3 et champs4) il ne reconnait pas les variables.
    Donc je me retrouve avec deux variables non definie lorsque aucune valeur est saisie.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public function getListeGroupe($champs1, $champs2, $champs3 = null, $champs4 = null)  {
     
        //...
       }
    la signature de cette méthode montre qu'elle prends 4 paramètres dont 2 optionnels (avec pour valeurs par défaut null). Dès lors tu peux tester, avec des valeurs en dur, cette fonction dans une classe de teste(phpunit) ou dans une action( action non ajax) de ton controlleur pour voir ce dont elle renvoie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            $em = $this->getDoctrine()->getManager();
            $listeGroupe = $em->getRepository('MainBundle:PqtDetails')->getListeGroupe("val1","val2");
            dump($listeGroupe); //que renvoie-t-elle ?

Discussions similaires

  1. [C# 2.0]Mettre une condition dans un repeater
    Par giloutho dans le forum ASP.NET
    Réponses: 1
    Dernier message: 07/11/2006, 19h13
  2. Réponses: 1
    Dernier message: 08/09/2006, 10h31
  3. mettre une condition dans l'ajout de données
    Par ash_rmy dans le forum Access
    Réponses: 2
    Dernier message: 27/07/2006, 13h29
  4. Mettre une condition if dans une requete sql
    Par Sardonnen dans le forum Oracle
    Réponses: 4
    Dernier message: 24/03/2006, 11h25
  5. mettre une condition au sein d'un echo
    Par mussara dans le forum Langage
    Réponses: 8
    Dernier message: 09/02/2006, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo