Projet

Général

Profil

Propel relations » Historique » Version 3

Anonyme, 03/01/2009 16:26
Quelques avancés dans la traduction, à terminer.

1 3
_Ceci est une traduction libre de "la page suivante":http://propel.phpdb.org/trac/wiki/Users/Documentation/1.3/Relationships de la documentation de Propel._
2 1
3 2
 = Les relations de base =
4 1
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 2
 == Définition des relations ==
8 1
9 3
 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 1
11 3
<pre>
12 1
 #! xml 
13 2
 <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
   <reference local="author_id" foreign="author_id"/>
19
 </foreign-key>
20
</table>
21
<table name="author">
22
 <column name="author_id" type="INTEGER" required="true" primaryKey="true"/>
23
 <column name="fullname" type="VARCHAR" size="40" required="true"/>
24
</table>
25 1
26 3
</pre>
27 2
28 1
 Propel utilisera ces informations pour: 
29 3
** Générer des FOREIGN KEY création SQL DDL dans votre fichier (par exemple, (((schema.sql)))) et 
30
** Créer getter et setter méthodes dans votre généré objets (par exemple_livre_aura un [[GetAuthor]]_()_et_setAuthor ()_méthode) 
31 1
32
 === One-to-One relations === 
33
34
 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): 
35
36 3
<pre>
37 1
 #! xml 
38 2
  <table name="bookstore_employee" description="Employees of a bookstore">
39
        <column
40
          name="id"
41
          type="INTEGER"
42
          primaryKey="true"
43
          autoIncrement="true"
44
          description="Employee ID number"/>
45
        <column
46
          name="name"
47
          type="VARCHAR"
48
          size="32"
49
          description="Employee name"/>
50
  </table>
51 1
52 2
  <table name="bookstore_employee_account" description="Bookstore employees' login credentials">
53
        <column
54
          name="employee_id"
55
          type="INTEGER"
56
          primaryKey="true"
57
          description="Primary key for "
58
          />
59
        <column
60
          name="login"
61
          type="VARCHAR"
62
          size="32"/>
63
        <column
64
          name="password"
65
          type="VARCHAR"
66
          size="100"/>
67
        <foreign-key foreignTable="bookstore_employee" onDelete="cascade">
68
          <reference local="employee_id" foreign="id"/>
69
        </foreign-key>
70
  </table>
71 1
72 3
</pre>
73 2
74 3
 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 1
76
 == Récupération des objets connexes == 
77
78 3
 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 1
80 3
<pre>
81 1
 #! php 
82
83 3
$books = [[BookPeer]]::doSelect(new Criteria());
84 2
foreach($books as $book) {
85
 $author = $book->getAuthor();
86
}
87 1
88 3
</pre>
89 1
90 3
 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 2
92 1
   1. 1 x SELECT * FROM livre 
93 3
   1. nx SELECT * FROM auteur si author_id =_$ livre-> getAuthorId ()_ 
94 1
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 3
<pre>
98 1
 #! php 
99
100 3
 $ livres = [[BookPeer]]:: doSelectJoinAuthor (nouveaux critères ()); 
101 1
 foreach ($ $ livres livre) ( 
102 3
  $ auteur = $ livre-> [[GetAuthor]] (); 
103 1
104 3
</pre>
105 2
106 1
 Dans le cas ci-dessus, une seule requête est effectuée: 
107
108
   1. SELECT * FROM livre LEFT JOIN auteur sur author.author_id = book.author_id 
109
110 3
 Continuer la lecture de la page sur les relations "Many-to-Many":http://propel.phpdb.org/trac/wiki/Users/Documentation/1.3/ManyToManyRelationships pour plus d'infos à ce sujet.
111 1
112
 == Relations dans l'aide de critères == 
113
114 3
 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]). 
115 1
116
 Dans les deux cas, vous pouvez ajouter des expressions pour l'une des tables jointes aux critères de l'objet: 
117
118 3
<pre>
119 1
 #! php 
120
121 2
$c = new Criteria(AuthorPeer::DATABASE_NAME);
122 1
123 3
$c->addJoin(AuthorPeer::ID, [[BookPeer]]::AUTHOR_ID, Criteria::INNER_JOIN);
124
$c->addJoin(BookPeer::PUBLISHER_ID, [[PublisherPeer]]::ID, Criteria::INNER_JOIN);
125 1
126 2
$c->add(PublisherPeer::NAME, 'Some Name');
127 1
128 3
$authors = [[AuthorPeer]]::doSelect($c);
129 1
130 3
</pre>
131 2
132 1
 ... serait équivalent à: 
133
134 3
<pre>
135 1
 #! sql 
136 2
SELECT * 
137
FROM author 
138
  INNER JOIN book ON book.author_id = author.id 
139
  INNER JOIN publisher ON publisher.id = book.publisher_id
140
WHERE publisher.name = 'Some Name'
141 1
142 3
</pre>
143 1
144 2
145 1
 == Primauté PHP noms pour les relations Getters / Setters == 
146
147 3
 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: 
148 1
149 3
<pre>
150 1
 #! xml 
151 2
<!-- test self-referencing foreign keys and inheritance-->
152
  <table name="bookstore_employee">
153
        <column
154
          name="id"
155
          type="INTEGER"
156
          primaryKey="true"
157
          autoIncrement="true"
158
          description="Employee ID number"/>
159
        <column
160
          name="name"
161
          type="VARCHAR"
162
          size="32"
163
          description="Employee name"/>
164
        <column
165
          name="job_title"
166
          type="VARCHAR"
167
          size="32"
168
          description="Employee job title"/>
169
        <column
170
          name="supervisor_id"
171
          type="INTEGER"
172
          description="Fkey to supervisor."/>
173
        <foreign-key foreignTable="bookstore_employee" 
174
                     phpName="Supervisor" 
175
                     refPhpName="Subordinate">
176
          <reference local="supervisor_id" foreign="id"/>
177
        </foreign-key>
178
  </table>
179 1
180 3
</pre>
181 2
182 1
 Ceci est un exemple d'un auto-référencement de table en librairie schema.xml. 
183
184 3
 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 ()*. 
185 1
186
 == Sur-Mise à jour et sur Supprimer les déclencheurs == 
187
188 3
 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. 
189 1
190 3
<pre>
191 1
 #! xml 
192 2
<table name="review">
193
 <column name="review_id" type="INTEGER" primaryKey="true" required="true"/>
194
 <column name="reviewer" type="VARCHAR" size="50" required="true"/>
195
 <column name="book_id" required="true" type="INTEGER"/>
196
        <foreign-key foreignTable="book" onDelete="CASCADE">
197
   <reference local="book_id" foreign="book_id"/>
198
 </foreign-key>   
199
</table>
200
201 3
</pre>
202 1
203 3
 Dans l'exemple ci-dessus, l'examen*'les lignes seront automatiquement supprimés si les_livre_ligne est supprimé.