Projet

Général

Profil

Propel crud » Historique » Version 3

Anonyme, 03/01/2009 09:23
Quelques corrections diverses et intégration d'exemples "Gépiesque".

1 1
''Ceci est une traduction libre de la page officielle de la documentation de Propel [http://propel.phpdb.org/trac/wiki/Users/Documentation/1.3/BasicCRUD /ICI]''
2
3 3
 = Opérations de base : C.R.U.D. (create, read, update, delete) = 
4 1
5 3
 Ce guide tente de montrer comment effectuer les opérations de base sur la base de données en utilisant Propel.
6 1
7 3
 Les exemples qui suivent supposent que vous avez déjà installé et paramétré Propel. 
8 1
9
 == CREATE == 
10
11 3
 Pour ajouter de nouvelles données dans la base, il faut instancier un des objets générés par Propel et ensuite appeler la méthode setChamp() appropriée. Propel générera le SQL qui va bien pour faire l'insertion. 
12 1
13
 === Simple INSERT ===
14
15
 Dans sa forme la plus simple, on crée un nouveau tuple de cette façon : 
16
17
18
{{{
19
# php 
20
 / * Initialiser Propel, etc * / 
21
22 3
 $user = new Utilisateur(); 
23
 $user->setPrenom("Thomas"); 
24
 $user->setNom("Belliard"); 
25
 $user->save();
26 1
}}}
27
 
28
Propel va traduire ces lignes de code par :
29
30
{{{
31
#! sql 
32 3
 INSERT INTO utilisateurs (prenom, nom) VALUES ('Thomas', 'Belliard');
33 1
}}}
34
35
36 2
 === Gérer les insertions connexes === 
37 1
38
 De plus, Propel sait si un objet a été sauvegardé ou pas. Donc on peut créer plusiers tuples de plusieurs tables différents et tout sauvegarder une seule fois :
39
40
{{{
41
 #! php 
42
 / * Initialiser Propel, etc * / 
43
44 3
 // 1) Créer un Auteur
45 1
46 3
 include_once 'librairie/Author.php'; 
47 1
48 3
 $author = new Author(); 
49
 $author->setFirstName("Leo"); 
50
 $author->setLastName("Tolstoï"); 
51
 // Note: ce tuple n'est pas encore dans la base
52 1
53 3
 // 2) Créer un Editeur
54 1
55 3
 include_once 'librairie/Publisher.php'; 
56 1
57 3
 $pub = new Editeur(); 
58
 $pub->setName("Viking Press"); 
59
 // Note: ce tuple n'est pas encore dans la base 
60 1
61 3
 // 3) Créer un livre
62 1
63 3
 include_once 'librairie/Book.php'; 
64 1
65 3
 $livre = new livre(); 
66
 $livre->setTitle("Guerre et Paix"); 
67
 $livre->setIsbn("0140444173"); 
68
 $livre->setPublisher($pub); 
69
 $livre->setAuthor($author); 
70
 $livre->save();
71
 // enregistre l'ensemble des 3 objets dans la base avec les dépendances (clés étrangères) qui vont bien ! 
72 1
}}}
73
74 3
 Parce que Propel sait si un objet a été enregistré ou non, il est capable avec save() d'analyser tous les objets avant de les ajouter en gérant les relations à l'objet livre. (Plus d'info à ce sujet sur le site de Propel : [http://propel.phpdb.org/trac/wiki/Users/Documentation/1.3/Relationships Relationships]) .
75 1
76
 == RETRIEVE ==
77 2
78 3
 Récupérer des objets de la base de données, également dénommés ''objets''hydratant, comme quand on effectue une requête SELECT pour peupler toutes les propriétés de l'objet peut se faire à l'aide des méthodes statiques PEER pour vérifier si ces enregistrements existent dans la table. Ces classes PEER ne contiennent que des méthodes statiques qui permettent d'effectuer des opérations sur la table.
79 1
Il existe plusieurs méthodes pour vous aider à choisir un seul ou plusieurs objets de la base de données. 
80 2
81 1
 === Récupération par la clé primaire === 
82 2
83 1
 La façon la plus simple pour récupérer un objet (ligne) de la base de données, est d'utiliser la méthode ''retrieveByPK()''. Comme d'habitude, il faut fournir la valeur de la clé primaire en argument à cette méthode.
84
85 3
 ==== La clé primaire est sur une seul colonne ==== 
86 2
87 1
 Habituellement, votre table aura une seule clé primaire, ce qui signifie que la méthode ''retrieveByPK()'' accepte un seul paramètre. 
88 2
89 1
{{{
90
 #! php 
91
92 3
 $firstBook = BookPeer::retrieveByPK(1); 
93
 // $firstBook est maintenant un objet livre, ou NULL si aucune correspondance n'a été trouvée. 
94 1
}}}
95 2
96 3
 ==== La clé primaire est sur plusieurs colonnes ==== 
97 1
98 3
 Dans certains cas, votre clé primaire est composée de plusieurs colonnes. Dans ce cas, ''retrieveByPK()'' acceptera des paramètres multiples, un pour chaque colonne de clé primaire. 
99 1
100
 Par exemple, si nous avions un tableau, avec un multi-colonne de clé primaire, définie comme ceci: 
101
{{{
102 2
 #! xml 
103 1
    <table name="multicolpk_example" phpName="MultiColPKExample"> 
104
       <column name="id1" type="INTEGER" primaryKey="true"/> 
105
       <column name="id2" type="INTEGER" primaryKey="true"/> 
106
       <! - Les autres colonnes ... -> 
107
    </ table> 
108
}}}
109
110
 ... alors votre méthode retrieveByPK()'' serait invoquée comme ceci: 
111
112 2
{{{
113
 #! php 
114 1
115 3
 $myObject = MultiColPKExamplePeer::retrieveByPK(1,2); 
116 1
}}}
117 2
118
 ==== Obtenir plusieurs objets par PK ==== 
119 1
120 3
 Vous pouvez également sélectionner plusieurs objets en fonction de leurs clés primaires, en appelant la méthode générée ''retrieveByPKs()'' qui prend en paramètre un tableau de clés primaires: 
121 1
122
{{{
123
 #! php 
124 2
125 3
 $selectedBooks = BookPeer::retrieveByPKs(array(1,2,3,4,5,6,7));
126
 // $SelectedBooks est un tableau d'objets
127 2
}}}
128
129
 ''Il est à noter que ceci ne fonctionne que pour les tables avec une seule colonne de clés primaires.'' 
130 1
131
 === Interrogation de la base de données === 
132
133 3
 Pour sélectionner plusieurs lignes par d'autres critères que la clé primaire, nous avons deux choix:[[BR]]
134 1
 1) d'utiliser la classe Criteria, ou[[BR]]
135 3
 2) d'écrire du SQL personnalisé.[[BR]]
136
 La classe ''Criteria'' offre une approche relativement simple à la construction d'une requête. C'est le meilleur choix pour construire des requêtes simples dans la base, mais pour une requête très complexe, il peut s'avérer plus efficace (et moins douloureux) de simplement utiliser une requête SQL personnalisée pour peupler (hydrate) votre objet Propel. 
137 2
138 1
 ==== Critères simples ==== 
139
140
 Voici quelques exemples de critères simples être utilisé pour renvoyer plusieurs objets. 
141
142 3
 '' 'Exemple 1:''' Trouver tous les auteurs dont le  prenom est Thomas, mais dont le nom n'est pas Belliard. 
143 1
144
{{{
145
 #! php 
146
147
 $c = new Criteria(); 
148 3
 $c->add(UtilisateurPeer::prenom, "Thomas"); 
149
 $c->add(UtilisateurPeer::nom, "Belliard", Criteria::NOT_EQUAL); 
150 2
151 3
 $users = UtilisateurPeer::doSelect($c); 
152
 // $users contient un tableau de tous les utilisateurs qui répondent à la requête 
153
 // {Trad} --> On voit ici toute l'utilité d'utiliser un IDE pour coder avec l'autocomplétion.
154 2
}}}
155
156 1
 ... on obtient les mêmes résultats qu'avec la requête SQL suivante: 
157 2
{{{ 
158
 #! sql 
159 3
 SELECT * FROM utilisateurs WHERE utilisateurs.prenom = 'Thomas' AND utilisateurs.nom <> 'Belliard';
160 2
161 1
}}}
162 2
163 3
 '''Exemple 2:''' Trouver tous les auteurs dont le nom est Tolstoy, Dostoevsky, ou Bakhtin
164 2
165
{{{
166
 #! php 
167 1
168
$c = new Criteria();
169 2
$c->add(AuthorPeer::LAST_NAME, array("Tolstoy", "Dostoevsky", "Bakhtin"), Criteria::IN);
170
171 1
$authors = AuthorPeer::doSelect($c);
172 2
173 1
 // $authors contient un tableau des objets auteurs
174 2
}}}
175
176
 ... on obtient les mêmes résultats qu'avec la requête SQL suivante: 
177
{{{
178
 #! sql 
179 1
 SELECT ... FROM author WHERE author.LAST_NAME IN ('Tolstoy', 'Dostoevsky', 'Bakhtin');
180 2
 
181
}}}
182
183
184
185 3
=== Utiliser des critères complexes ===
186 1
187 3
 Quand vous avez besoin d'exprimer des relations logiques (ET, OU, etc) dans la clause where de la requête, vous devez combiner manuellement chaque objet Criteria() ensemble. Ces clauses sont ensuite ajouter à la requête par la méthode ''Criteria->add()''.
188 1
189 3
 '''Exemple 1:''' Trouver tous les auteurs dont le prénom est "Leo" et le nom est "Tolstoy", "Dostoevsky", "Bakhtin". 
190 1
191 3
{{{
192
 #! php
193 1
194 3
$c = new Criteria();
195
$cton1 = $c->getNewCriterion(AuthorPeer::FIRST_NAME, "Leo");
196
$cton2 = $c->getNewCriterion(AuthorPeer::LAST_NAME,  array("Tolstoy", "Dostoevsky", "Bakhtin"), Criteria::IN);
197 1
 
198 3
// On combine toutes ces clauses...
199
$cton1->addOr($cton2);
200 1
 
201 3
// ...qu'on ajoute au critère (sic), à la requête quoi ;)
202
$c->add($cton1);
203 1
204 3
 
205
}}}
206
207 1
 ... résultats dans la requête SQL comme: 
208 3
{{{
209 1
 #! sql 
210 3
 SELECT ... FROM author WHERE (author.FIRST_NAME = 'Leo' OR author.LAST_NAME IN ('Tolstoy', 'Dostoevsky', 'Bakhtin'));
211
}}}
212
213
= J'ai un peu avancé, j'en suis ici ;) =
214 1
215
 Il ya aussi des''critères''raccourcis si vous souhaitez effectuer une requête avec les relations logiques entre les clauses de référence que''la même colonne''. 
216
217
 '' 'Exemple 2:''' Trouver tous les auteurs avec le premier nom de «Leo» ou «Karl» 
218
219
 Utiliser Critère verbose''approche'', cela ressemble à: 
220
 ((( 
221
 #! php 
222
 <? php 
223
224
 $ c = de nouveaux critères (); 
225
 cton1 $ = $ c-> getNewCriterion (AuthorPeer:: first_name, "Léon"); 
226
 cton2 $ = $ c-> getNewCriterion (AuthorPeer:: first_name, "Karl"); 
227
 
228
 / / Les combiner 
229
 $ cton1-> Addor ($ cton2); 
230
 
231
 / / Ajouter les critères 
232
 $ c-> add ($ cton1); 
233
 ))) 
234
235
 En utilisant un raccourci''''méthodes Critères: 
236
 ((( 
237
 #! php 
238
 <? php 
239
240
 $ c = de nouveaux critères (); 
241
 $ c-> ajouter (AuthorPeer:: first_name, "Léon"); 
242
 $ c-> Addor (AuthorPeer:: first_name, "Karl"); 
243
 ))) 
244
245
 Il est important de noter que ces critères sténographie''''méthodes ont un certain nombre de limites - surtout qu'ils ne fonctionne que pour les relations seule colonne. De l'auteur, il est conseillé de ne pas utiliser ces méthodes lorsque vous avez besoin d'exprimer les relations entre logique clause car ils masquent le réel entre les relationsihps Critère''et''objets peuvent facilement conduire à difficiles à déboguer les problèmes de génération de requête. (Ces méthodes vont probablement changer ou disparaître dans Propel 2). 
246
247
 Utiliser ==== ==== SQL personnalisé 
248
249
 Propel est conçu pour travailler avec vous plutôt que contre vous. Dans de nombreux cas, la rédaction d'un complexe requête en utilisant les critères''''finit par être vraiment désordre et encore moins intelligible ou à maintenir un niveau de requête SQL. Propel a été créé pour travailler les limites inhérentes d'une base de données''neutre''système de critères en la rendant facile pour vous d'utiliser vos propres requêtes SQL pour les ensembles de résultats hydrate. 
250
251
 Ainsi, avec seulement un peu plus de travail, vous pouvez également obtenir des objets de votre base de données en utilisant SQL. Utiliser SQL pour interroger la base de données nous introduit à la populateObjects généré''()''méthode dans notre classes Peer - qui est appelé dans les coulisses par la doSelect''()''méthode. Cette méthode attend d'être adopté une créole''!''Objet ResultSet, indexé numériquement (c'est-à-dire qui a été créé à l'aide! ResultSet:: FETCHMODE_NUM option''à executeQuery ()''). 
252
253
 '' 'Exemple 1:''' Utilisez des sous-sélectionne pour peupler la base de données 
254
255
 ((( 
256
 #! php 
257
 <? php 
258
259
 $ con = Propel:: getConnection (database_name); 
260
261
 $ sql = "SELECT .* livres des livres lorsqu'ils ne sont pas EXISTS (SELECT id de l'examen OÙ book_id = book.id)"; 
262
 $ stmt = $ con-> prepare ($ sql); 
263
 $ stmt-> execute (); 
264
265
 $ livres = BookPeer:: populateObjects ($ stmt); 
266
 ))) 
267
268
 Des choses importantes à retenir lorsque vous utilisez SQL personnalisé pour remplir Propel: 
269
   *! ResultSet colonne doit être indexé numériquement 
270
   *! ResultSet doit contenir toutes les colonnes de l'objet 
271
   *! ResultSet doit avoir les colonnes''dans le même ordre'', telles qu'elles sont définies dans le (((schema.xml))) fichier 
272
273
 MISE À JOUR == == 
274
275
 Mise à jour de la base de données comporte essentiellement des lignes de récupérer des objets, de modifier le contenu, puis les enregistrer. Dans la pratique, pour Propel, il s'agit d'une combinaison de ce que nous avons déjà vu dans le récupérer et créer des sections. 
276
277
 ((( 
278
 #! php 
279
 <? php 
280
281
 / / 1) Récupère un objet de clé primaire 
282
283
 = $ myBook BookPeer:: retrieveByPK (1); 
284
285
 / / 2) de mettre à jour les valeurs et save (). 
286
287
 myBook $ -> setTitle ( "Guerre et Paix"); 
288
 $ myBook-> save (); 
289
 ))) 
290
291
 Il n'y a vraiment pas grand-chose de bien plus que cela. Bien sûr, vous pouvez également mettre à jour les relations d'une manière similaire à ce qui a déjà été démontré dans la section CREATE. 
292
293
 ((( 
294
 #! php 
295
 <? php 
296
 / * Initialiser Propel, etc * / 
297
298
 / / 1) Auteur de récupérer une 
299
 $ auteur = AuthorPeer:: retrieveByPK (1); 
300
301
 / / 2) récupérer un livre 
302
 $ livre = BookPeer:: retrieveByPK (1); 
303
304
 / / 3) maintenant aveuglément set $ auteur que l'auteur de livre $! 
305
306
 $ livre-> setAuthor ($ author); 
307
 $ livre-> save (); 
308
 ))) 
309
310
 == == DELETE 
311
312
 Suppression d'objets peut être accompli en utilisant les classes Peer ou l'objet classes. 
313
314
 === === L'aide par les pairs 
315
316
 Vous pouvez utiliser les produits doDelete''()''de la méthode générée par les pairs des classes à supprimer des lignes de vos tables. Vous pouvez passer cette méthode une clé primaire, une instance de l'objet, ou même un objet de critères (mais ce n'est pas très utile, puisque vous ne pouvez supprimer que par la clé primaire). 
317
318
 '' 'Exemple 1:''' Supprimer l'aide de la clé primaire 
319
320
 ((( 
321
 #! php 
322
 <? php 
323
324
 BookPeer:: doDelete (1); 
325
 ))) 
326
327
 '' 'Exemple 2:''' Supprimer l'aide de l'objet instancié 
328
329
 ((( 
330
 #! php 
331
 <? php 
332
333
 $ livre = BookPeer:: retrieveByPK (1); 
334
 BookPeer:: doDelete ($ livre); 
335
 ))) 
336
337
 L'aide d'objets === === 
338
339
 Par souci de cohérence avec d'autres C.R.U.D. opérations, vous pouvez également supprimer la ligne d'une base de données à l'aide de la classe d'objets. Certaines personnes préfèrent le faire de cette façon, l'instanciation d'un objet, puis appeler la''delete ()''méthode sur celle-ci. D'autres estiment que cela est "bizarre", car alors vous êtes à gauche avec un objet qui ne fait point à la ligne une base de données. Quel que soit - vous êtes libre de choisir:) 
340
341
 ((( 
342
 #! php 
343
 $ livre = BookPeer:: retrieveByPK (1); 
344
 $ livre-> delete (); 
345
 / / (Et maintenant vous devez vous rappeler que vous ne pouvez plus utiliser l'objet $ livre) 
346
 )))