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 :

Code plus propre pour une recherche


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 44
    Points : 33
    Points
    33
    Par défaut Code plus propre pour une recherche
    Bonjour,

    J'aurais besoin de votre aide afin d'alléger mon code sous Symfony.

    Je m'explique : J'ai un formulaire de recherche où je veux rechercher un employé par plusieurs critères ( qui sont des entités ).

    Exemple du formulaire : Un select avec la fonction de l'employé, un select avec le service de l'employé, un secteur etc..
    Je voudrais qu'il sois possible dans ce formulaire, de selectionner parfois qu'une valeur ( les employés qui ont cette fonction précise mais dans tous les services ).
    Fonction, Service et Secteur sont des entités. Elles sont reliés à l'entité Employé par leur id ( employé contient id_fonction, id_service & id_secteur ).

    Mon formulaire est dans une vue twig en HTML, avec des checkbox et des select. Les données sont récupérées en Json et renvoyés au controller.

    Actuellement je fais comme ça dans mon controlleur :

    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
    if($request->isXmlHttpRequest()) {
     
    // Je récupère mes données des select/ checkbox
            $fonction = $request->request->get('fonction');
            $service= $request->request->get('service');
            $secteur= $request->request->get('secteur');
     
     
    // Ici interviennent mes multiples conditions ...
    if ($fonction !='' AND $service !='' AND $secteur !='' ) {
     
    // J'appel mon repository avec la requête qui contient les paramètres fonction ET service ET secteur
    }
     
    // Puis je fais ça pour toutes les options possibles
    if ($fonction !='' AND $service !='' ) 
    if ( $service !='' AND $secteur !='' )  // etc...
     
     $query = $qb->getQuery();              
      $arrayJson = $query->getResult();
     
    // Et ensuite je les mets dans mon tableau JSON
     
              foreach ($arrayJson as $key => $value) {
                $arrayJson= array(
                  'nom' => $value->getNom(),
                  'prenom' => $value->getPrenom());
                $arrayJson[]= array($arrayJson);
              }
    return new Response(json_encode($arrayJson));
    Alors oui ça marche, mais c'est 'gros' et 'moche' non ?
    Du coup j'ai trop de conditions, et aussi trop de requêtes dans mes repository pour chaque option..
    Avez vous une méthode plus 'propre' pour faire ce que je souhaite ?

    Je vous remercie

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 49
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    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
     
    	if (($fonction) {
    		if ($service) {
    			if ($secteur) {
    				// requête avec 3 paramètres
    				$toto = '3 paramètres';
    			} else {
    				// requête avec deux paramètres
    				$toto = '2 paramètres';
    			}
    		} else {
    			// requête avec un paramètre
    			$toto = '1 paramètre';
    		}
    	}
     
    	// ton $query-> $qb->getQuery()->getResult() tu peux le faire dans ton Repo
    Il y a toujours moyen de faire mieux mais je trouve que c'est un bon compromis

  3. #3
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Bonjour fa_dev,

    Le plus gros du travail devrait se faire au niveau du repository et non au niveau du contrôleur.

    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
    //Dans le contrôleur
    if($request->isXmlHttpRequest()) {
        $fonction = $request->request->get('fonction');
        $service = $request->request->get('service');
        $secteur = $request->request->get('secteur');
     
        //EntityManager
        $em = $this->getDoctrine()->getManager();
        //Appel de la méthode rechercher() du repository UtilisateurRepository
        $utilisateurs = $em->getRepository("AppBundle:Utilisateur")->rechercher($fonction, $service, $secteur);
     
        $arrayJson = array();
        //Cette boucle pourrait se faire au niveau du Repository et ce dernier devrait retourner un array JSON
        foreach ($utilisateurs as $utilisateur) {
            $arrayJson[] = array(
                'nom' => $utilisateur->getNom(),
                'prenom' => $utilisateur->getPrenom()
            );
        }
        return new Response(json_encode($arrayJson));
    }
    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
    //Dans UtilisateurRepository
    public function rechercher($fonction = null, $service = null, $secteur = null)
    {
        //On ramène tous les utilisateurs par défaut
        $qB = $this->createQueryBuilder('u')
            ->where('1 = 1');
     
        //Si fonction est définie
        if (!is_null($fonction)) {
            $qB->innerJoin('u.fonction', 'f') //on fait la jointure avec l'entité fonction
                ->andWhere('f.id = :fonction')) //on applique le filtre
                ->setParameter('fonction', $fonction);
        }
        //Si service est défini
        if (!is_null($service)) {
            $qB->innerJoin('u.service', 's') //on fait la jointure avec l'entité service
                ->andWhere('s.id = :service')) //on applique le filtre
                ->setParameter('service', $service);
        }
        //Si secteur est défini
        if (!is_null($secteur)) {
            $qB->innerJoin('u.secteur', 'st') //on fait la jointure avec l'entité secteur
                ->andWhere('st.id = :secteur')) //on applique le filtre
                ->setParameter('secteur', $secteur);
        }
     
        return $qB->getQuery()->getResult(); //on renvoit le résultat
    }
    J'espère que cela t'aide pour faire un peu plus "propre".

    Cordialement,
    Mahefasoa
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi!
    Albert Einstein

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 44
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup ! En effet c'est bien plus propre : je vais essayer ça.

Discussions similaires

  1. Réponses: 10
    Dernier message: 31/08/2016, 11h36
  2. Amélioration du code pour une recherche
    Par Devilju69 dans le forum VB.NET
    Réponses: 8
    Dernier message: 03/07/2009, 14h28
  3. Réponses: 1
    Dernier message: 03/10/2008, 21h34
  4. Importance des accents pour une recherche dans postgre
    Par glouf dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 05/03/2005, 13h25
  5. [VB.NET] Quel objet tableau pour une recherche indexée ???
    Par Kitano dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/09/2004, 09h38

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