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

Langage PHP Discussion :

PHP classe Budgetiseur [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Points : 114
    Points
    114
    Par défaut PHP classe Budgetiseur
    Bonjour à tous,

    Je viens vers vous pour un petit coup de pouce sur une classe destinée à gérer un module Budget

    Le principe :
    Ce module contient donc des groupes pouvant avoir une infinité de sous-groupes et postes à budgétiser (démandé par le chef)
    Groupe 1
    --Groupe 1.1
    ----Poste 1.1.a
    --Groupe 1.2
    ----Poste 1.2.a
    ----Groupe 1.2.1
    ------Poste 1.2.1.a
    ----etc à l'infini....
    Groupe 2
    --Groupe 2.1
    --etc...

    Ma table budget_groupes
    id = id du groupe
    idp = id du groupe parent
    name = nom du groupe
    descr = description du groupe
    etat = Etat du groupe (0 ou 1)
    Chaque groupe et sous-groupes contient des postes auquel on assigne un budget annuel
    J'ai donc 2 autres table

    Ma table budget_postes
    id = id du poste
    idg = id du groupe auquel appartient le poste
    name = nom du poste
    descr = description du poste
    etat = Etat du groupe (0 ou 1)
    Ma table budget_prices
    id = id du budget
    idp = id du poste
    year = année du budget
    price = budget alloué
    solde = Solde du budget
    Le script :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?php
     
    // Pour mes test j'inclus l'objet pdo dans le constructeur, par la suite je ferai une extension de l'objet PDO
    // Pour mes test je passe les vérifications de type et autre
    class Budget{
     
        public $pdo = false;     // Objet de connexion PDO
        public $year = 0;         // Année ciblée 
        public $data = array(); // Tableau de données
     
        public function __construct($pdo=false,$year=0){
            $this->pdo = $pdo;
            $this->year = $year;  // Si 0 = année actuelle bien sûr
            $this->data = $this->_getGroupes(0);
        }
     
        public function _getGroupes($idp=0){ // idp = id du groupe parent
            $a = array();
            $req = "SELECT * FROM budget_groupes WHERE idp='".$idp."'";
            $qry = $this->pdo->query($req);
            while($r = $qry->fetch(PDO::FETCH_ASSOC)){
                $a[$r['id']] = $r;
                $a[$r['id']]['sub'] = ($r['idp'] > 0) ? $this->_getGroupes($r['idp']) : false; // Récursivité
                $a[$r['id']]['poste'] = $this->_getPostes($r['id']);
                $a[$r['id']]['budget'] = 0; // C'EST ICI LE PROBLEME, comment obtenir le total du budget des différents groupes et/ou postes enfants 
            }
            return $a;
        }
     
        public function _getPostes($idg=0){ // idg = id du groupe auquel appartient les postes
            $a = array();
            $req = "SELECT * FROM budget_postes WHERE idg='".$idg."'";
            $qry = $this->pdo->query($req);
            while($r = $qry->fetch(PDO::FETCH_ASSOC)){
                $a[$r['id']] = $r;
                $a[$r['id']]['budget'] = $this->_getBugetPoste($r['id']); 
            }
            return $a;
        }
     
        public function _getBudgetPoste($id=0){ // id = id du poste ciblé
            $req = "SELECT * FROM budget_prices WHERE idp='".$id."' AND year='".$this->year."'";
            $qry = $this->pdo->query($req);
            // Un poste ne peux avoir qu'un seul budget pour une année, pas besoin de boucle
            return ($qry->rowCount() > 0) ? $qry->fetch(PDO::FETCH_ASSOC) : array('id'=>0,'idp'=>$id,'year'=>$this->year,'price'=>0,'solde'=>0);
        }
     
    }
     
    $o = new Budget($pdo,2022);
    print_r($o->data);
     
    ?>
    Mon problème :
    1) Déjà est-ce que ma méthode est correcte ou je me complique la vie ?

    2) Comment insérer dans l'itération ['budget'] des groupes et sous-groupe, le total des sous-groupes et/ou postes enfants sans passer à nouveau par une multitude de requêtes ?

    J'ai bien le budget sur mes postes, mais pas de total du budget sur les groupes et sous-groupes
    C'est là que je coince et que j'ai besoin de vos lumière, car je retourne la chose dans ma tête dans tous les sens, mais je n'arrive à rien, je ne vois pas quelle approche abordée pour éviter la surcharge de requête.

    D'avance merci de votre participation.
    Belle journée à tous
    Spliffer

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    déjà les tables budget_groupes et budget_postes sont presque pareilles donc je pense que vous pouvez les mettre ensemble dans une seule table. et donc les postes seront les feuilles de l'arbre formé par les groupes.

    pour les calculs des totaux, ces données dépendent d'autres données de la tables donc au moment de la conception de la structure de la bdd, les totaux n'ont pas leur place dans les tables.
    commencez déjà par faire la page qui cherche les données et affiche les totaux. et ensuite faite des mesures pour savoir si la page s'affiche assez vite et c'est à ce moment que vous allez décider s'il y a quelque chose à optimiser en utilisant des tables de cache ou des fichiers de cache pour accélérer l'affichage.

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    J'ai bien le budget sur mes postes, mais pas de total du budget sur les groupes et sous-groupes
    C'est là que je coince et que j'ai besoin de vos lumière, car je retourne la chose dans ma tête dans tous les sens, mais je n'arrive à rien, je ne vois pas quelle approche abordée pour éviter la surcharge de requête
    MySQL 8 intègre les CTE récursives, cela te permettra de parcourir ton arbre avec une seule requête. Reste à tester si c'est viable.

    https://dev.mysql.com/doc/refman/8.0/en/with.html
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Une alternative à l'approche récursive est la représentation intervallaire. Si les opérations d'insertions demandent un peu plus de travail, en revanche les selections sont enfantines et performantes.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    L'approche récursive n'est valable que pour de toute petite profondeur.
    Quand on à une infinité de hierarchie on va très vite rencontrer des problèmes de performances que la représentation intervallaire n'aura pas.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Points : 114
    Points
    114
    Par défaut
    Bonjour Tout le monde,

    La solution de mathieu marche très bien, j'ai donc regrouper les groupes et poste dans la même Table, et ensuite je récupère les données de total qui dépendent en effet d'une autre table, au final ca convient parfaitement.

    Merci à tous pour vos participations, je suis encore occupé de me pencher un peu plus sur les autres solutions aaportées pour voir les différences de performance

    Je met donc le sujet en résolu

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

Discussions similaires

  1. php classe "$this" ou "self" ?
    Par Jcpan dans le forum Langage
    Réponses: 3
    Dernier message: 29/08/2010, 14h21
  2. envoi d'un email avec piece jointe php / classe mime_mail
    Par xunil2003 dans le forum Langage
    Réponses: 1
    Dernier message: 01/04/2010, 03h12
  3. [PHP 4] Boucle PHP classée par catégorie
    Par Boub.J dans le forum Langage
    Réponses: 9
    Dernier message: 05/11/2009, 15h18
  4. PHP Class resize image
    Par stefanelle dans le forum Langage
    Réponses: 3
    Dernier message: 19/10/2009, 12h07

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