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 :

Optimisation d'un code [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Par défaut Optimisation d'un code
    Bonjour, voici mon "probleme", en quelque sorte ...
    J'ai une liste de "sites", que je veux organiser en arbre, selon divers critères

    • Par département
      • Loire
        • Site 1
        • Site 2
        • Site n
      • Saone et Loire
        • Site n
    • Par ville
      • Lyon
        • Site 1
        • Site n
      • Paris
        • Site 1
        • Site 2
        • Site n
    • Par région
      • Rhone-Alpes
        • Site 1
        • Site n
      • Haute-Alpes
        • Site 2
        • Site n
    • DE A a Z
      • Site 1
      • Site 2
      • Site n


    Un Site peut donc être présent plusieurs fois.
    Mon souci vient de l'optimisation du code, en effet pour chaque nouveau critère (département, ville, région ...), je fais une nouvelle requête dans mon action.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $this->list_%%critere%%=Doctrine::getTable('%%critere%%')
                                             ->getWithSiteQuery()
                                             ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
    foreach($this->list_%%critere%% as $key=>$value){
          $q = Doctrine::getTable('%%critere%%')
                                ->getSiteQuery($value['id']);
     
          $this->list_%%critere%%[$key]['sites']=$q->execute();
    }
    J'utilise ici %%critere%% pour vous faire comprendre que ce bloc de code est dupliqué à chaque fois, avec un nouveau critère.

    Question : Ca serait pas un peu barbare ma technique ? , d'autant plus que je vais avoir de plus en plus de critères, des idées pour optimiser tout ca ?

    Je trouve bizarre de faire autant de requêtes, alors qu'on va chercher les mêmes objets en DB, et que juste l'affichage est différent.

    Merci d'avance,

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je ne comprend pas comment tu peux faire une relation "many-to-many" avec seulement deux tables ?

    Je suppose que getSiteQuery() et getWithSiteQuery() sont des méthodes que tu as développées, sans le code sous-jacent, difficile de comprendre.

    Peux-tu donner plus d'information et aussi le shema.yml de ta base ?

  3. #3
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Par défaut
    En fait c'est une relation one-to-many. C'est à dire que par exemple un département comprend n sites, je voulais simplement dire qu'un site sera présent à la fois dans le département "Loire", mais aussi dans la liste de A a Z et dans la ville "Lyon".

    Voici le code de mon action en totalité, j'ai remis le code factorisé du modèle pour plus de clarté.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    public function executeIndex(sfWebRequest $request){
     
        // la liste des départments avec leurs sites	
        $this->departement_liste=Doctrine::getTable('departement')
                    ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
        foreach($this->departement_liste as $key=>$value){
            $q = Doctrine_Query::create()
                                 ->from('site s')
                                ->where('s.id_departement = ?', $value['id'];
     
            $this->departement_liste[$key]['sites']=$q->execute();
        }
     
        // la liste des villes avec leurs sites
        $this->ville_liste=Doctrine::getTable('ville')
                            ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
        foreach($this->ville_liste as $key=>$value){
            $q = Doctrine_Query::create()
                                ->from('site s')
                                ->where('s.id_ville = ?', $value['id'];
     
            $this->ville_liste[$key]['sites']=$q->execute();
        }
     
        // la liste des régions avec leurs sites
        $this->region_liste=Doctrine::getTable('region')
                            ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
        foreach($this->region_liste as $key=>$value){
            $q = Doctrine_Query::create()
                                ->from('site s')
                                ->where('s.id_region = ?', $value['id'];
     
            $this->region_liste[$key]['sites']=$q->execute();
        }
     
        // la liste des sites de A a Z
        $this->AtoZ_liste=Doctrine::getTable('site')
                            ->execute(array(), Doctrine::HYDRATE_ARRAY);
     
    }
    J'imagine qu'il doit y avoir plus simple et plus optimisé.
    Merci en tout cas d'avoir pris du temps pour me répondre

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Et une requête du genre (attention, c'est juste une idée, je n'ai pas testé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $q = new Doctrine_Query::create()->
                    from('Site s')->
                    leftJoin('s.Departement d')->
                    where('s.id_departement = ?', $value['id'])->
                    orWhere('s.id_ville = ?', $value['id']);
    devrait retourner les sites d'un département ou d'une ville et les régions correspondantes.

    Plus d'info dans DQL (Doctrine Query Language) sur le site de Doctrine (en anglais mais facilement compréhensible).

  5. #5
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Par défaut
    Normalement ca devrais marcher ta requête, sauf que je veux aussi la liste de tous les départements,
    la liste donnée dans mon premier poste constitue le rendu exact dans ma page, rien de plus, rien de moins.


    je vois 3 méthodes pour avoir ce rendu
    - celle que j'ai utilisé, avec des requêtes distinctes selon le type de tri
    - une requête simple sur la table "site", puis tout retrier en PHP
    - une requête simple sur la table "site", puis tout retrier en javascript

    Quelle est la méthode la plus rapide ?

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Dans ton exemple de début, les départements affichés ont tous un site et il n'y a pas de site pour les départements qui ne soient dans les autres listes...

    Il faudra effectivement faire quelques tris dans les tableaux de résultats, mais en mémoire.

    On peut aussi créer trois requêtes, une pour les départements, une pour les villes et une pour les régions, cela fait toujours beaucoup moins que l'actuel. Ceci me semble être la solution la plus simple, et peut-être la plus rapide car une très grosse jointure avec plusieurs conditions "ou" qui ne pourront pas être optimisées par un index...

    Quant a re-trier en javascript, cela condamne tous ceux qui n'ont pas ou on désactivé le javascript, ce qui me semble une mauvaise idée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Optimisation C++] Calcul code altitude
    Par Spout dans le forum C++
    Réponses: 7
    Dernier message: 13/11/2007, 22h17
  2. Y a-t-il une solution pour optimiser mon petit code ?
    Par pierre987321 dans le forum Delphi
    Réponses: 20
    Dernier message: 14/06/2007, 10h53
  3. Optimisation de mon code ActionScript
    Par amnesias dans le forum Flash
    Réponses: 9
    Dernier message: 01/04/2007, 22h04
  4. Optimisation d'un code !
    Par leserapheen dans le forum Pascal
    Réponses: 20
    Dernier message: 09/03/2007, 14h00
  5. [MMX] Optimisation d'un code C++ -> plus lent
    Par Laurent Gomila dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 17/05/2006, 18h47

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