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