/
recuperation-enregistrements.gtw
255 lines (187 loc) · 8.88 KB
/
recuperation-enregistrements.gtw
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
~~LANG:EN@enman:daos/use-result~~
Créer, modifier et supprimer des enregistrements dans une base de données est
très utile. Mais c'est encore mieux si on peut les lire. Voici comment récupérer
un ou plusieurs enregistrements.
===== Récupérer un seul enregistrement =====
La méthode à utiliser avec la fabrique (factory), est @@M@get()@@ en lui donnant
la valeur de la clé primaire de l'enregistrement.
La méthode retourne directement l'objet correspondant à l'enregistrement. Chaque
propriété de l'objet correspond à un champs de l'enregistrement, tel que c'est
déclaré dans le fichier dao.
<code php>
// instanciation de la factory
$maFactory = jDao::get("foo");
// récupération d'un record dont le contenu correspond
// à l'enregistrement ayant pour identifiant 3
$baz = $maFactory->get(3);
// récupération d'un des champs de l'enregistrement, ici par
// exemple si un champs id existe.
$id = $baz->id
</code>
Dans le cas où votre table comporte une clé multiple déclarée dans le fichier
XML du DAO au moyen de @@A@primarykey="cle1,cle2"@@, vous devez donner toutes
les valeurs de la clé en même temps, comme ceci :
<code php>
$maFactory = jDao::get("foo");
// 3 et 4 sont ici les valeurs respectives de cle1 et cle2
$baz = $maFactory->get(3, 4);
</code>
ou
<code php>
$maFactory = jDao::get("foo");
// 3 et 4 sont ici les valeurs respectives de cle1 et cle2
$baz = $maFactory->get(array(3, 4));
</code>
**Attention** : Il est impératif que l'ordre dans lequel sont passées les
valeurs soit le même que celui déclaré dans l'attribut @@A@primarykey@@. En
bref, @@$maFactory->get(4, 3)@@ est bien différent de @@$maFactory->get(3, 4)@@.
La méthode @@M@delete()@@ fonctionne de la même façon.
===== Récupérer une liste d'enregistrements =====
Quand vous voulez récupérer tout les enregistrements, il faut utiliser
@@M@findAll()@@. Cette méthode retourne un objet @@C@jDbResultSet@@ qui
permettra alors de récupérer un à un les enregistrements. Rappelez vous que
cette classe implémente l"interface Iterator, et est donc utilisable directement
dans un @@foreach@@.
<code php>
// instanciation de la factory
$maFactory = jDao::get("foo");
// récupération d'une liste complète de records de type foo
$liste = $maFactory->findAll();
foreach ($liste as $row) {
// $row contient un enregistrement
echo $row->id;
}
</code>
Vous pouvez aussi utiliser deux autres méthodes de @@C@jDbResultSet@@. La
première est @@M@fetch()@@, qui permet de récupérer un enregistrement, et avance
ensuite un "curseur" vers l'enregistrement suivant. Vous pouvez l'appeler alors
plusieurs fois de suite pour parcourir la liste des enregistrements.
<code php>
// parcours de toute la liste
while ($row = $liste->fetch()) {
// $row contient un enregistrement
echo $row->id;
}
</code>
Vous avez aussi @@M@fetchAll()@@ qui permet de récupérer tout d'un seul coup
dans un tableau php.
<code php>
$rows = $list->fetchAll();
foreach ($rows as $rowID => $row) {
echo $row->id;
}
</code>
Vous pouvez réaliser des méthodes de récupération personnalisées, en les
spécifiant dans le fichier XML (voir [[methodes_xml|DAO avancés]]).
===== Récupérer des records selon critères =====
Les factory DAO mettent à disposition trois méthodes @@M@findBy()@@,
@@M@countBy()@@ et @@M@deleteBy()@@ qui s'utilisent en leur passant un objet
@@C@jDaoConditions@@, objets que vous récupérez avec @@C@jDao@@. Voici un
exemple :
<code php>
$conditions = jDao::createConditions();
$conditions->addCondition('libelle','=',$un_nom);
$conditions->addCondition('status','=',5);
$liste = $maFactory->findBy($conditions);
$count = $maFactory->countBy($conditions);
</code>
Tout comme @@M@findAll()@@, @@M@findBy()@@ renvoie un objet @@C@jDbResultSet@@
qui permet de parcourir la liste des enregistrements qui correspondent aux
critères indiqués.
La méthode @@M@addCondition()@@ prend en paramètre un nom de propriété, un
opérateur (SQL), et une valeur.
Vous pouvez aussi indiquer un ordre de sélection avec la méthode
@@M@addItemOrder()@@, et regrouper divers critères ensemble avec
@@M@startGroup()@@ et @@M@endGroup()@@ :
<code php>
$conditions = jDao::createConditions();
// condition : libelle = $un_nom AND (status=5 OR status=4) ORDER BY libelle desc
$conditions->addCondition('libelle','=',$un_nom);
$conditions->startGroup('OR');
$conditions->addCondition('status','=',5);
$conditions->addCondition('status','=',4);
$conditions->endGroup();
$conditions->addItemOrder('libelle','desc');
$liste = $maFactory->findBy($conditions);
</code>
Pour ajouter une clause LIMIT, La méthode @@M@findBy()@@ prend en plus 2
paramètres optionnels: le numéro du premier enregistrement à récupérer (offset),
et le nombre d'enregistrement à renvoyer.
Par exemple pour récupérer les 15 premiers enregistrements :
<code php>
$liste = $maFactory->findBy($conditions, 0, 15);
</code>
La méthode @@M@countBy()@@ quant à elle, prend un paramètre optionnel qui est le
nom de propriété du champ sur lequel on veut appliquer une clause DISTINCT, ce
qui donne par exemple:
<code php>
// SELECT COUNT(DISTINCT table.libelle)...
$count = $maFactory->countBy($conditions, 'libelle');
</code>
Enfin, la méthode @@M@deleteBy()@@ permet d'effacer des enregistrements selon
critères et retourne le nombre de lignes effacées:
<code php>
$nb_deleted = $maFactory->deleteBy($conditions);
</code>
Vous verrez que vous pouvez obtenir le même résultat via des méthodes dans le
fichier XML. Cependant, l'utilisation de l'une ou l'autre des possibilités
dépend du contexte.
Vous utiliserez @@C@jDaoConditions@@ lorsque que vous ne savez pas à l'avance le
nombre de critères et leur type. Cela peut être le cas suite à un formulaire de
recherche complexe, où l'utilisateur peut choisir ses critères. Vous utiliserez
aussi @@C@jDaoConditions@@ lorsque la recherche que vous faites n'est utilisée
qu'à un seul moment et rarement. En effet, les méthodes XML sont compilées en
PHP, et donc incluses à chaque fois que vous faites appel à la factory. Il n'est
peut-être pas utile d'inclure à chaque fois du code qui ne sert presque jamais.
Dans les autres cas, il est recommandé de passer par les méthodes XML, en
particulier donc quand vous connaissez les critères à l'avance (sans forcément
connaître leur valeur bien sûr), et que c'est une recherche souvent utilisée. En
effet, jDao crée les requêtes SQL à l'avance dans la classe générée, ce qui
évite construire les requêtes SQL à chaque fois qu'on les utilise, permettant
alors de meilleurs performances globales.
Il arrive souvent par exemple de redéfinir la méthode @@M@findAll@@ en XML, pour
indiquer un ordre de récupération.
=== Les différents opérateurs SQL pris en compte ===
Comme expliqué précédemment, la méthode @@M@addCondition()@@ prend en second
paramètre un opérateur SQL. Ce dernier prend en compte les opérateurs de
comparaison ainsi que les prédicats suivants :
* LIKE, NOT LIKE, ILIKE,
* IN, NOT IN,
* IS, IS NOT,
* IS NULL, IS NOT NULL,
* MATCH, REGEXP, NOT REGEXP, RLIKE, SOUNDS LIKE
* @@~@@, @@!~@@, @@~*@@, @@!~*@@ (operateurs pour les expressions régulières de postgresql)
== Cas spéciaux avec des valeurs NULL ==
Pour tester une valeur NULL ou non NULL, vous pouvez utiliser tout ce que SQL vous propose
(IS NULL, IS NOT, ...), même "=" ou "!=". N'oubliez pas de passer une valeur @@null@@ PHP
et non pas la chaine "NULL".
<code php>
$conditions->addCondition('status','=', null); // equivalent à IS NULL
$conditions->addCondition('status','!=', null); // equivalent à IS NOT NULL
$conditions->addCondition('status','IS', null);
$conditions->addCondition('status','IS NOT', null);
$conditions->addCondition('status','IS NULL', null);
$conditions->addCondition('status','IS NOT NULL', null);
$conditions->addCondition('status','LIKE', null);
$conditions->addCondition('status','NOT LIKE', null);
...
</code>
== Expressions régulières ==
Pour les bases qui le supporte (postgresql par exemple), on peut indiquer une expression régulière.
Avec Postgresql, vous utiliserez @@~@@, @@!~@@, @@~*@@, @@!~*@@.
<code php>
$conditions->addCondition('status','~', '^test');
...
</code>
Pour les autres bases, si elles le supportent, vous utiliserez @@REGEXP@@ ou @@NOT REGEXP@@.
=== Faire un groupby ===
Avec @@C@jDaoConditions@@, vous pouvez indiquer les propriétés sur lesquelles il
faut faire un @@groupby@@ en SQL. Pour ce faire, il faut appeler la méthode
@@M@addItemGroup($field)@@ :
<code php>
$conditions = jDao::createConditions();
$conditions->addCondition('libelle','=',$un_nom);
$conditions->addItemGroup('status');
$liste = $maFactory->findBy($conditions);
</code>
Ici un groupby sera effectué sur le champs status.