Projet

Général

Profil

Propel relations » Historique » Version 1

Anonyme, 31/12/2008 11:46
Le texte proposé par google-traduction. A retravailler sur toute la ligne.

1 1
Ceci est une traduction libre de [http://propel.phpdb.org/trac/wiki/Users/Documentation/1.3/Relationships la page suivante] de la documentation de Propel
2
3
Les relations de base = = 
4
5
 Soutien pour propulser les relations entre les objets des cartes directement à la façon que les bases de données de soutien des relations entre les tables en utilisant des clés étrangères. Relation de soutien dans Propel est donc facile à comprendre, mais il hérite aussi de certains de la simplicité de ce modèle, par exemple, Propel ne cache pas le fait que vous devez utiliser un système de références croisées, table pour plusieurs-vers-plusieurs rapports (voir la [wiki: Users/Documentation/1.3/ManyToManyRelationships Many-to-Many relations] page pour en savoir plus sur ce sujet). 
6
7
 Définition des relations == == 
8
9
 Les relations sont spécifiées par la création des clés étrangères dans les''''<table> sections de votre (((schema.xml))) fichier. Vous utilisez le <foreign-key>''''tag à créer une relation entre une table et un autre, en utilisant le même principe de base que vous devez utiliser relatives à un tableau à l'autre au niveau de la base de données. 
10
11
 ((( 
12
 #! xml 
13
 <table name="book"> 
14
  <column name="book_id" type="INTEGER" required="true" primaryKey="true"/> 
15
  <column NAME="title" type="VARCHAR" size="100" required="true"/> 
16
  <column name="author_id" type="INTEGER" required="true"/> 
17
  <foreign-key foreignTable="author"> 
18
    <référence 
19
      local = "author_id" 
20
      étrangers = "author_id" /> 
21
  </ foreign-key> 
22
 </ table> 
23
 <table name="author"> 
24
  <column name="author_id" type="INTEGER" required="true" primaryKey="true"/> 
25
  <column name="fullname" type="VARCHAR" size="40" required="true"/> 
26
 </ table> 
27
 ))) 
28
29
 Propel utilisera ces informations pour: 
30
  * Générer des FOREIGN KEY création SQL DDL dans votre fichier (par exemple, (((schema.sql)))) et 
31
  * Créer getter et setter méthodes dans votre généré objets (par exemple''livre''aura un GetAuthor''()''et''setAuthor ()''méthode) 
32
33
 === One-to-One relations === 
34
35
 Propel 1.3 prend en charge cas particulier one-to-one relations (voir billet: 279). One-to-one relations sont définies lors de la clé primaire est également une clé étrangère. Par exemple (simplifié de la librairie schema.xml): 
36
37
 ((( 
38
 #! xml 
39
   <table name="bookstore_employee" description="Employees d'un bookstore"> 
40
         <colonne 
41
 Name = "id" 
42
 Type = "integer" 
43
 PrimaryKey = "true" 
44
 AutoIncrement = "true" 
45
 Description = "Employee ID nombre" /> 
46
 <Colonne 
47
 Name = "nom" 
48
 Type = "VARCHAR" 
49
 Size = "32" 
50
 Description = "Nom de l'employé" /> 
51
   </ table> 
52
53
   <table name="bookstore_employee_account" description="Bookstore employees' login credentials"> 
54
 <Colonne 
55
 Name = "employee_id" 
56
 Type = "integer" 
57
 PrimaryKey = "true" 
58
 Description = "clé primaire pour" 
59
 /> 
60
 <Colonne 
61
 Name = "login" 
62
 Type = "VARCHAR" 
63
 Size = "32" /> 
64
 <Colonne 
65
 Name = "mot de passe" 
66
 Type = "VARCHAR" 
67
 Size = "100" /> 
68
 <foreign-key foreignTable="bookstore_employee" onDelete="cascade"> 
69
 <Référence Local="employee_id" foreign="id"/> 
70
 </ Foreign-key> 
71
   </ table> 
72
 ))) 
73
74
 Parce que la clé primaire de la bookstore_employee_account''''est aussi une clé étrangère à la bookstore_employee''''table, Propel interprète cela comme un one-to-one relation et générer des méthodes singulières pour les deux parties de la relation - par exemple '' '! BookstoreEmployee-> getBookstoreEmployeeAccount ()''' et'''! BookstoreEmployeeAccount-> getBookstoreEmployee ()'''. 
75
76
 == Récupération des objets connexes == 
77
78
 En utilisant l'exemple ci-dessus (sur la base du schéma prévu librairie), vous avez un''livre-> GetAuthor ()''qui retourne un''''Auteur objet en utilisant la clé étrangère. 
79
80
 ((( 
81
 #! php 
82
 <? php 
83
84
 $ livres = BookPeer:: doSelect (nouveaux critères ()); 
85
 foreach ($ $ livres livre) ( 
86
  $ auteur = $ livre-> GetAuthor (); 
87
 ) 
88
 ))) 
89
90
 Le code ci-dessus se traduirait par l'exécution de 1 + n SQL, où n est le nombre de livres (et, par conséquent, nombre d'itérations de la''''boucle foreach): 
91
92
   1. 1 x SELECT * FROM livre 
93
   1. nx SELECT * FROM auteur si author_id =''$ livre-> getAuthorId ()'' 
94
95
 S'il est clair que cette méthode fonctionne, il n'est pas optimale pour exécuter cette deuxième requête pour chaque itération. Propel génère également des méthodes dans votre classe de base par les pairs pour aller chercher les deux auteur de livres et de l'information dans une seule requête en utilisant un LEFT JOIN * ^ ^. 
96
97
 ((( 
98
 #! php 
99
 <? php 
100
101
 $ livres = BookPeer:: doSelectJoinAuthor (nouveaux critères ()); 
102
 foreach ($ $ livres livre) ( 
103
  $ auteur = $ livre-> GetAuthor (); 
104
 ) 
105
 ))) 
106
107
 Dans le cas ci-dessus, une seule requête est effectuée: 
108
109
   1. SELECT * FROM livre LEFT JOIN auteur sur author.author_id = book.author_id 
110
111
 Continuer la lecture de la [wiki: Users/Documentation/1.3/ManyToManyRelationships Many-to-Many relations] pour une page de ce traitement plus avancé realtionship sujet. 
112
113
 ^ ^ * Notez que dans Propel 1.3 Le comportement a changé à partir de l'exercice INNER JOIN à l'aide de LEFT JOIN par défaut. S'il vous plaît voir wiki: Users/Documentation/1.3/Upgrading pour plus d'informations et des instructions sur la façon de garder l'original INNER JOIN problème si votre application dépend. 
114
115
 == Relations dans l'aide de critères == 
116
117
 Vous pouvez créer des requêtes qui utilisent les relations en utilisant la commande'' 'doSelectJoin *()''' méthodes ou par précisant explicitement s'associe à l'objet de critères (voir [wiki: Documentation/1.3/Criteria]). 
118
119
 Dans les deux cas, vous pouvez ajouter des expressions pour l'une des tables jointes aux critères de l'objet: 
120
121
 ((( 
122
 #! php 
123
 <? php 
124
125
 $ c = new critères (AuthorPeer:: database_name); 
126
127
 $ c-> addJoin (AuthorPeer:: ID, BookPeer:: author_id, Critères:: INNER_JOIN); 
128
 $ c-> addJoin (BookPeer:: PUBLISHER_ID, PublisherPeer:: ID, Critères:: INNER_JOIN); 
129
130
 $ c-> ajouter (PublisherPeer:: NOM, 'un nom'); 
131
132
 = $ auteurs AuthorPeer:: doSelect ($ c); 
133
 ))) 
134
135
 ... serait équivalent à: 
136
137
 ((( 
138
 #! sql 
139
 SELECT * 
140
 De l'auteur 
141
   INNER JOIN livre sur book.author_id = author.id 
142
   INNER JOIN éditeur sur publisher.id = book.publisher_id 
143
 OÙ publisher.name = 'Certains Nom " 
144
 ))) 
145
146
147
 == Primauté PHP noms pour les relations Getters / Setters == 
148
149
 Comme de Propel 1.3 (voir billet: 23), il est possible de fournir des noms de PHP pour les méthodes qui sont créés pour la récupération de clé étrangère liée objets. Vous pouvez spécifier la clé étrangère phpName''''et''''refPhpName attributs dans la <foreign-key> élément. Espérons que l'exemple fera la mise en œuvre (et de motivation pour cette fonctionnalité) clair: 
150
151
 ((( 
152
 #! xml 
153
 <! - Test d'auto-référencement des clés étrangères et de l'héritage -> 
154
   <table name="bookstore_employee"> 
155
         <colonne 
156
           name = "id" 
157
           type = "integer" 
158
           PrimaryKey = "true" 
159
           autoIncrement = "true" 
160
           description = "Employee ID nombre" /> 
161
         <colonne 
162
           name = "nom" 
163
           type = "VARCHAR" 
164
           size = "32" 
165
           description = "Nom de l'employé" /> 
166
         <colonne 
167
           name = "job_title" 
168
           type = "VARCHAR" 
169
           size = "32" 
170
           description = "titre des employés au travail" /> 
171
         <colonne 
172
           name = "supervisor_id" 
173
           type = "integer" 
174
           description = "Fkey au superviseur." /> 
175
         <foreign-key = foreignTable "bookstore_employee" 
176
                      phpName = "Superviseur" 
177
                      refPhpName = "subordonné"> 
178
           <Référence local="supervisor_id" foreign="id"/> 
179
         </ foreign-key> 
180
   </ table> 
181
 ))) 
182
183
 Ceci est un exemple d'un auto-référencement de table en librairie schema.xml. 
184
185
 Le''''phpName attribut affecte de nommage des méthodes comme'' 'setSupervisor ()''', alors que le''''refPhpName attribut affecte de nommage des méthodes qui travaillent avec les références des clés étrangères - par exemple '' 'addSubordinate ()''',''' getSubordinates ()'''. 
186
187
 == Sur-Mise à jour et sur Supprimer les déclencheurs == 
188
189
 Propel soutient également la''''ON UPDATE et DELETE''sur''de l'aspect des clés étrangères. Ces propriétés peuvent être spécifiées dans le <foreign-key>''''à l'aide de la balise onUpdate''''et''''onDelete attributs. Propel soutient les valeurs de la "cascade", "SETNULL», et «RESTRICT» pour ces attributs. Pour les bases de données qui ont des clés étrangères de soutien, de déclencher ces événements seront précisées au niveau datbase l'étranger lorsque les clés sont créées. Pour les bases de données qui ne supportent pas les clés étrangères, cette fonctionnalité sera suivi par Propel. 
190
191
 ((( 
192
 #! xml 
193
 <table name="review"> 
194
  <column name="review_id" type="INTEGER" primaryKey="true" required="true"/> 
195
  <column name="reviewer" type="VARCHAR" size="50" required="true"/> 
196
  <column name="book_id" required="true" type="INTEGER"/> 
197
 <foreign-key foreignTable="book" onDelete="CASCADE"> 
198
    <Référence local="book_id" foreign="book_id"/> 
199
  </ foreign-key> 
200
 </ table> 
201
 ))) 
202
203
 Dans l'exemple ci-dessus, l'examen''''les lignes seront automatiquement supprimés si les''livre''ligne est supprimé.