Commit d84529c14fad3f4c42b4ad9dc1742d5270e5303b
1 parent
fc8a73bb
Exists in
master
and in
1 other branch
ajout scripts connexion BD et executions requetes ORM depuis console ou scripts
Showing
5 changed files
with
336 additions
and
0 deletions
Show diff stats
... | ... | @@ -0,0 +1,23 @@ |
1 | +#!/usr/bin/env bash | |
2 | + | |
3 | +# AVEC DOCKER ? | |
4 | +if [[ -f ../DOCKER_LABINVENT_DB_ROOT ]] ; then | |
5 | + cd ../ | |
6 | + ./DOCKER_LABINVENT_DB_ROOT | |
7 | + exit | |
8 | +fi | |
9 | + | |
10 | + | |
11 | +# SANS DOCKER | |
12 | +source install/ENV.sh | |
13 | +#echo $MYSQL_ROOT_LOGIN | |
14 | +#echo $MYSQL_ROOT_PASSWORD | |
15 | + | |
16 | +#echo $MYSQL_PORT #127.0.0.1:3307 | |
17 | +#MYSQL_PORT=$(echo "$MYSQL_PORT" | cut -d':' -f 2) | |
18 | +#echo $MYSQL_PORT #3307 | |
19 | + | |
20 | +mysql -h 127.0.0.1 -u $MYSQL_ROOT_LOGIN -p$MYSQL_ROOT_PASSWORD | |
21 | +#mysql -h 127.0.0.1 -u $MYSQL_USER -P $MYSQL_PORT --protocol=tcp -p$MYSQL_PASSWORD | |
22 | +#mysql -h 127.0.0.1 -u $MYSQL_USER -P $MYSQL_PORT -p$MYSQL_PASSWORD | |
23 | + | ... | ... |
... | ... | @@ -0,0 +1,23 @@ |
1 | +#!/usr/bin/env bash | |
2 | + | |
3 | +# AVEC DOCKER ? | |
4 | +if [[ -f ../DOCKER_LABINVENT_DB_USER ]] ; then | |
5 | + cd ../ | |
6 | + ./DOCKER_LABINVENT_DB_USER | |
7 | + exit | |
8 | +fi | |
9 | + | |
10 | + | |
11 | +# SANS DOCKER | |
12 | +source install/ENV.sh | |
13 | +#echo $MYSQL_USER | |
14 | +#echo $MYSQL_PASSWORD | |
15 | + | |
16 | +#echo $MYSQL_PORT #127.0.0.1:3307 | |
17 | +#MYSQL_PORT=$(echo "$MYSQL_PORT" | cut -d':' -f 2) | |
18 | +#echo $MYSQL_PORT #3307 | |
19 | + | |
20 | +mysql -h 127.0.0.1 -u $MYSQL_USER -p$MYSQL_PASSWORD | |
21 | +#mysql -h 127.0.0.1 -u $MYSQL_USER -P $MYSQL_PORT --protocol=tcp -p$MYSQL_PASSWORD | |
22 | +#mysql -h 127.0.0.1 -u $MYSQL_USER -P $MYSQL_PORT -p$MYSQL_PASSWORD | |
23 | + | ... | ... |
... | ... | @@ -0,0 +1,280 @@ |
1 | +<?php | |
2 | +namespace App\Shell; | |
3 | + | |
4 | +use Cake\Console\Shell; | |
5 | +use Cake\Utility\Inflector; | |
6 | +//use Cake\Utility\Text; | |
7 | + | |
8 | + | |
9 | +define("NL", "\n\n"); | |
10 | + | |
11 | +class DbShell extends Shell | |
12 | +{ | |
13 | + | |
14 | + public function initialize():void | |
15 | + { | |
16 | + parent::initialize(); | |
17 | + $this->loadModel('Utilisateurs'); | |
18 | + $this->loadModel('Familles'); | |
19 | + $this->loadModel('PlanningPermanences'); | |
20 | + } | |
21 | + | |
22 | + // bin/cake db show_user Admin | |
23 | + public function showUser() | |
24 | + { | |
25 | + if (empty($this->args[0])) { | |
26 | + // Utilisez error() avant CakePHP 3.2 | |
27 | + return $this->abort("Merci de rentrer un nom d'utilisateur."); | |
28 | + } | |
29 | + //$user = $this->Utilisateurs->findByUsername($this->args[0])->first(); | |
30 | + $user = $this->Utilisateurs->findByNom($this->args[0])->first(); | |
31 | + $this->out(print_r($user, true)); | |
32 | + } | |
33 | + // bin/cake db voir_user_admin | |
34 | + public function voirUserAdmin() | |
35 | + { | |
36 | + //$this->showUser('Admin'); | |
37 | + $user = $this->Utilisateurs->findByNom('Admin')->first(); | |
38 | + $this->out(print_r($user, true)); | |
39 | + } | |
40 | + | |
41 | + // bin/cake db hey_there Steven | |
42 | + public function heyThere($name = 'Anonymous') | |
43 | + { | |
44 | + $this->out('Hey there ' . $name); | |
45 | + } | |
46 | + | |
47 | + | |
48 | + // bin/cake db liste_beneficiaires_et_personenes | |
49 | + public function listePlanningPermanencesEtLeursVisites() | |
50 | + { | |
51 | + $entities = $this->PlanningPermanences->find()->contain([ | |
52 | + // 'Permanences', // TODO ajouter gestion de la table PlanningPermanences | |
53 | + // 'EpicerieVisites', // TODO | |
54 | + ]); | |
55 | + foreach ($entities as $e) print($e); | |
56 | + } | |
57 | + | |
58 | + // bin/cake db listeBenevolesAvecLeurRoleEtEquipe | |
59 | + public function listeBenevolesAvecLeurRoleEtEquipe() | |
60 | + { | |
61 | + $entities = $this->Utilisateurs->find()->contain([ | |
62 | + 'Roles', | |
63 | + 'Equipes', | |
64 | + ]); | |
65 | + foreach ($entities as $e) print($e); | |
66 | + } | |
67 | + | |
68 | + | |
69 | + // bin/cake db liste_beneficiaires_et_personenes | |
70 | + public function listeBeneficiairesAvecLeursPersonnesLienEtLeursContratsTransactionPermanenceHoraireEtLeursVisites() { | |
71 | + $familles_personnes = $this->Familles->find()->contain([ | |
72 | + 'Personnes' => [ | |
73 | + 'sort' => 'Personnes.prenom' | |
74 | + ], | |
75 | + 'Personnes.Liens', | |
76 | + 'Contrats' => [ | |
77 | + 'sort' => ['Contrats.date_fin' => 'DESC'] | |
78 | + ], | |
79 | + 'Contrats.Transactions', | |
80 | + 'Contrats.Horaires', | |
81 | + 'Contrats.Permanences', | |
82 | + 'Contrats.EpicerieVisites', | |
83 | + ]); | |
84 | + foreach ($familles_personnes as $fp) print($fp); | |
85 | + } | |
86 | + | |
87 | + public function listeBeneficiairesAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire() { | |
88 | + $familles = $this->Familles->find()->contain([ | |
89 | + // - Seulement le contact principal de la famille | |
90 | + 'Personnes.Liens' => function ($q) { | |
91 | + return $q | |
92 | + ->where(['Liens.nom' => 'principal']); | |
93 | + }, | |
94 | + // - Les contrats | |
95 | + // On les trie du plus récent au plus ancien, par la date de fin, puis la date début | |
96 | + // (pour le cas où 2 contrats avec même date fin) | |
97 | + 'Contrats' => [ | |
98 | + 'sort' => ['Contrats.date_fin'=>'DESC', 'Contrats.date_debut'=>'DESC'] | |
99 | + ], | |
100 | + 'Contrats.Transactions', | |
101 | + 'Contrats.Horaires', | |
102 | + 'Contrats.Permanences', | |
103 | + // - Les visites (de chaque contrat) | |
104 | + 'Contrats.EpicerieVisites', | |
105 | + ]); | |
106 | + foreach ($familles as $f) { | |
107 | + $f->contrats = current($f->contrats); | |
108 | + print($f); | |
109 | + } | |
110 | + return $familles; | |
111 | + } | |
112 | + public function beneficiaireAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire($id) { | |
113 | + $familles = $this->listeBeneficiairesAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire(); | |
114 | + echo NL.NL.NL; | |
115 | + $f = $familles->where(['id' => $id])->first(); | |
116 | + echo $f; | |
117 | + $f->contrats = current($f->contrats); | |
118 | + echo $f; | |
119 | + } | |
120 | + | |
121 | + // bin/cake db liste_beneficiaires_et_contrats | |
122 | + // Liste de toutes les familles avec seulement leur dernier contrat, en 2 étapes | |
123 | + // (plus de détails sur https://book.cakephp.org/4/fr/orm/retrieving-data-and-resultsets.html) | |
124 | + public function listeBeneficiairesEtContrats($LAST_CONTRAT_ONLY=false) | |
125 | + { | |
126 | + //$familles = Cake\ORM\TableRegistry::getTableLocator()->get('Familles'); | |
127 | + //$familles_contrats = $this->Familles->find()->contain('Contrats'); | |
128 | + | |
129 | + // 1) On récupère toutes les familles et tous leurs contrats, en triant les contrats par date de fin décroissante. | |
130 | + $familles_contrats = $this->Familles->find()->contain([ | |
131 | + 'Contrats' => [ | |
132 | + 'sort' => ['Contrats.date_fin' => 'DESC'] | |
133 | + //'sort' => ['Contrats.date_fin' => 'ASC'] | |
134 | + ] | |
135 | + ]); | |
136 | + // NB: si on remplace DESC par ASC on obtiendra le contrat le plus ancien (à l'étape 2) | |
137 | + | |
138 | + | |
139 | + /* | |
140 | + $q = $this->Familles->find(); | |
141 | + $familles_contrats = $q->select([ | |
142 | + 'Familles.id', | |
143 | + 'Familles.adresse', | |
144 | + 'Familles.complement_adresse', | |
145 | + 'last_contrat_date' => $q->func() | |
146 | + ->min('Contrats.date_fin') | |
147 | + ->partition('Contrats.famille_id'), | |
148 | + /S | |
149 | + 'Contrats.id', | |
150 | + 'Contrats.date_debut', | |
151 | + 'Contrats.date_fin', | |
152 | + 'Contrats.recurrence', | |
153 | + S/ | |
154 | + ]) | |
155 | + ->innerJoinWith('Contrats'); | |
156 | + */ | |
157 | + /* | |
158 | + $this->Familles->hasOne('FirstContrat', [ | |
159 | + 'className' => 'Contrats', | |
160 | + 'foreignKey' => 'famille_id' | |
161 | + ]); | |
162 | + $familles_contrats = $this->Familles->find()->contain([ | |
163 | + 'FirstContrat' => [ | |
164 | + 'strategy' => 'select', | |
165 | + 'queryBuilder' => function ($q) { | |
166 | + return $q->order(['FirstContrat.date_fin' =>'DESC'])->limit(1); | |
167 | + } | |
168 | + ] | |
169 | + ]); | |
170 | + */ | |
171 | + /* | |
172 | + $this->Familles->hasOne('FirstContrat', [ | |
173 | + 'className' => 'Contrats', | |
174 | + 'foreignKey' => 'famille_id', | |
175 | + 'strategy' => 'select', | |
176 | + 'sort' => ['FirstContrat.date_fin' => 'DESC'], | |
177 | + 'conditions' => function ($e, $query) { | |
178 | + $query->limit(1); | |
179 | + return []; | |
180 | + } | |
181 | + ]); | |
182 | + */ | |
183 | + /* | |
184 | + $this->Familles->hasOne('LastContrat', [ | |
185 | + 'className' => 'Contrats', | |
186 | + 'foreignKey' => 'famille_id', | |
187 | + 'strategy' => 'select', | |
188 | + 'sort' => ['LastContrat.date_fin' => 'DESC'], | |
189 | + //'sort' => ['LastContrat.date_fin' => 'ASC'], | |
190 | + 'conditions' => function ($e, $query) { | |
191 | + return []; | |
192 | + } | |
193 | + ]); | |
194 | + $familles_contrats = $this->Familles->find()->contain('LastContrat'); | |
195 | + */ | |
196 | + /* | |
197 | + $this->hasOne('FirstImage', [ | |
198 | + 'className' => 'Images', | |
199 | + 'foreignKey' => 'image_id', | |
200 | + 'strategy' => 'select', | |
201 | + 'sort' => ['FirstImage.created' => 'DESC'], | |
202 | + 'conditions' => function ($e, $query) { | |
203 | + $query->limit(1); | |
204 | + return []; | |
205 | + } | |
206 | + ]) | |
207 | + */ | |
208 | + /* | |
209 | + $familles_contrats = $this->Familles->find()->contain([ | |
210 | + 'Contrats' => [ | |
211 | + // changement de stratégie inutile | |
212 | + //'strategy' => 'select', | |
213 | + 'strategy' => 'subquery', | |
214 | + 'queryBuilder' => function ($q) { | |
215 | + //return $q->order(['Contrats.date_fin' =>'ASC'])->limit(1); | |
216 | + //return $q->order(['Contrats.date_fin' =>'DESC'])->limit(1); | |
217 | + return $q->order(['Contrats.date_fin' =>'DESC'])->limit(1); | |
218 | + } | |
219 | + ] | |
220 | + ]); | |
221 | + */ | |
222 | + | |
223 | + // 2) Puis on traite les familles une par une, et pour chacune, on prend seulement le dernier contrat, c'est à dire le 1er de la liste : | |
224 | + //foreach ($familles_contrats as $f) echo $f; | |
225 | + foreach ($familles_contrats as $f) { | |
226 | + //print_r($f->contrats); | |
227 | + //if ( $LAST_CONTRAT_ONLY && count($f->contrats)>0 ) $f->contrats = $f->contrats[0]; | |
228 | + if ($LAST_CONTRAT_ONLY) $f->contrats = current($f->contrats); | |
229 | + echo $f; | |
230 | + } | |
231 | + | |
232 | + /* | |
233 | + // Si on veut afficher seulement la famille 215 (qui a 3 contrats) => n'affiche QUE le contrat le plus récent, soit le 240 (date fin 2021-06-01) | |
234 | + $f215 = $familles_contrats->where(['id' => 215])->first(); | |
235 | + echo($f215); | |
236 | + */ | |
237 | + } | |
238 | + | |
239 | + /* | |
240 | + $query->contain([ | |
241 | + 'Comments' => [ | |
242 | + 'sort' => ['Comments.created' => 'DESC'] | |
243 | + ] | |
244 | +]); | |
245 | + */ | |
246 | + | |
247 | + | |
248 | + public function listeBeneficiairesEtTousContrats() { $this->listeBeneficiairesEtContrats(false); } | |
249 | + public function listeBeneficiairesEtDernierContrat() { $this->listeBeneficiairesEtContrats(true); } | |
250 | + | |
251 | + function sl() { | |
252 | + echo "\n\n"; | |
253 | + //echo $this->nl(2); | |
254 | + } | |
255 | + | |
256 | + // Methode exécutée par défaut si on n'appelle aucune fonction : bin/cake db | |
257 | + public function main() | |
258 | + { | |
259 | + $requests = [ | |
260 | + 'listeBenevolesAvecLeurRoleEtEquipe', | |
261 | + 'listeBeneficiairesEtTousContrats', | |
262 | + 'listeBeneficiairesEtDernierContrat', | |
263 | + 'listeBeneficiairesAvecLeursPersonnesLienEtLeursContratsTransactionPermanenceHoraireEtLeursVisites', | |
264 | + 'listeBeneficiairesAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire', | |
265 | + 'BeneficiaireAvecLeContactPrincipalEtLeDernierContratTransactionPermanenceHoraire', | |
266 | + 'listePlanningPermanencesEtLeursVisites', | |
267 | + ]; | |
268 | + | |
269 | + //$this->out('Hello world.'); | |
270 | + echo NL."Requêtes disponibles :"; | |
271 | + foreach ($requests as $req) { | |
272 | + echo NL."- " . Inflector::underscore($req); | |
273 | + } | |
274 | + echo NL; | |
275 | + } | |
276 | + | |
277 | + | |
278 | +} | |
279 | + | |
280 | +?> | ... | ... |