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
Chaque groupe et sous-groupes contient des postes auquel on assigne un budget annuelid = id du groupe
idp = id du groupe parent
name = nom du groupe
descr = description du groupe
etat = Etat du groupe (0 ou 1)
J'ai donc 2 autres table
Ma table budget_postes
Ma table budget_pricesid = 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)
Le script :id = id du budget
idp = id du poste
year = année du budget
price = budget alloué
solde = Solde du budget
Mon problème :
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); ?>
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
Partager