Subversion-Projekte lars-tiefland.prado

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<com:TContent ID="Main">
2
 
3
<h1>Création des classes Active Record</h1>
4
 
5
<p>
6
Nous avons besoin de définir deux classes <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>, <tt>UserRecord</tt> et <tt>PostRecord</tt>, qui représentent respectivement les tables <tt>users</tt> et <tt>posts</tt>. Les classes Active Record doivent hériter de la classe <tt>ActiveRecord</tt>, et doivent définir les propriétés qui correspondent aux champs de la table correspondante.
7
</p>
8
 
9
<p>
10
Pour une meilleure organisation de notre arborescence, nous créons un nouveau dossier <tt>protected/database</tt> qui contiendra nos deux classes. Nous modifions notre fichier de configuration de l'application en y insérant les lignes suivantes. Ceci est équivalent à inclure le dossier <tt>protected/database</tt> à notre chemin d'inclusion de PHP (<tt>include_path</tt>). Cela nous permet d'utiliser nos classes sans avoir besoin de les inclure explicitement.
11
</p>
12
 
13
<com:TTextHighlighter CssClass="source" Language="xml">
14
<paths>
15
  <using namespace="Application.database.*" />
16
</paths>
17
</com:TTextHighlighter>
18
 
19
<p>
20
Au lieu de créer nos classes manuellement, nous allons utiliser les <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">outils en ligne de commande de PRADO</a> pour qu'il nous génère les classes.
21
</p>
22
 
23
<p>
24
Dans le dossier <tt>blog</tt>, lancer la commande suivante pour entrer dans le mode interactif de l'outil en ligne de commande:
25
</p>
26
 
27
<com:TTextHighlighter CssClass="source cli">
28
php path/to/prado-cli.php shell .
29
</com:TTextHighlighter>
30
 
31
<p>
32
Vous devriez voir
33
</p>
34
 
35
<com:TTextHighlighter CssClass="source cli" Language="text">
36
Command line tools for Prado 3.1.0.
37
** Loaded PRADO appplication in directory "protected".
38
PHP-Shell - Version 0.3.1
39
(c) 2006, Jan Kneschke <jan@kneschke.de>
40
 
41
>> use '?' to open the inline help
42
 
43
>>
44
</com:TTextHighlighter>
45
 
46
<p>
47
A l'invite de commande, entrer les deux commandes suivantes pour créer les classes <tt>UserRecord</tt> et <tt>PostRecord</tt>.
48
</p>
49
 
50
<com:TTextHighlighter CssClass="source cli" Language="text">
51
>> generate users Application.database.UserRecord
52
 
53
>> generate posts Application.database.PostRecord
54
</com:TTextHighlighter>
55
 
56
<p>
57
Ici, nous avons utilisés les <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">espaces de noms</a> pour indiquer où les classes seront créées. Le chemin <tt>Application.database.UserRecord</tt> indique que nous désirons que la classe soit insérée dans <tt>protected/database/UserRecord.php</tt>.
58
</p>
59
 
60
<p>
61
Nous devrions voir l'arborescence suivante ainsi que nos deux nouveaux fichiers dans le dossier <tt>protected/database</tt>:
62
</p>
63
 
64
<img src="<%~ directories2.gif %>" class="output" />
65
 
66
<p>
67
Si vous consultez le fichier <tt>PostRecord</tt>, vous devriez voir le contenu suivant:
68
</p>
69
 
70
<com:TTextHighlighter CssClass="source" Language="php">
71
class PostRecord extends TActiveRecord
72
{
73
    const TABLE='posts';
74
    public $post_id;
75
    public $author_id;
76
    public $create_time;
77
    public $title;
78
    public $content;
79
    public $status;
80
 
81
    public static function finder($className=__CLASS__)
82
    {
83
        return parent::finder($className);
84
    }
85
}
86
</com:TTextHighlighter>
87
 
88
<p>
89
Comme vous pouvez le constater, pour chaque champs de la table <tt>posts</tt>, la classe déclare un membre correspondant. La constante <tt>TABLE</tt> indique le nom de la table que gère la classe <tt>PostRecord</tt>. La méthode statique <tt>finder()</tt> permet d'effectuer des requêtes et de lire les données sous forme d'objets <tt>PostRecord</tt>.
90
</p>
91
<p>
92
Vous pouvez utiliser l'outil en ligne de commande pour tester nos nouvelles classes. En restant dans le mode interactif de l'outil en ligne de commande, vous pouvez saisir les commandes PHP et voir ce qui suit. Vous pouvez tester des commandes telles que <tt>UserRecord::finder()->findAll()</tt>.
93
</p>
94
 
95
<com:TTextHighlighter CssClass="source cli" Language="text">
96
>> PostRecord::finder()->findAll()
97
array
98
(
99
    [0] => PostRecord#1
100
    (
101
        [post_id] => '1'
102
        [author_id] => 'admin'
103
        [create_time] => '1175708482'
104
        [title] => 'first post'
105
        [content] => 'this is my first post'
106
        [status] => '0'
107
        [TActiveRecord:_readOnly] => false
108
        [TActiveRecord:_connection] => null
109
        [TComponent:_e] => array()
110
    )
111
)
112
</com:TTextHighlighter>
113
 
114
<h1>Relations entre Posts et Users</h1>
115
<p>
116
Rappellez-vous qu'il y a une relation entre les tables <tt>users</tt> et <tt>posts</tt>. Le diagramme des relations est indiqué ci-après.
117
</p>
118
 
119
<img src="<%~ ER.gif %>" class="output" />
120
 
121
<p>
122
A partir de ce diagramme, nous voyons que la table <tt>posts</tt> contient un champ <tt>author_id</tt>. Le champ <tt>author_id</tt> est une clé étrangère qui référence la table <tt>users</tt>. En particulier, les valeurs du champ <tt>author_id</tt> doivent apparaitre dans dans le champ <tt>username</tt> de la table <tt>users</tt>. Une des conséquences de cette relation, en réfléchissant orienté objet, est que chaque "post" repose sur un "author" et qu'un "author" peut avoir plusieurs "posts".
123
</p>
124
 
125
<p>
126
Nous pouvons modéliser les relations entre <tt>posts</tt> and <tt>users</tt> dans nos classes <tt>PostRecord</tt> and <tt>UserRecord</tt> en les modifiant comme ci-dessous :
127
</p>
128
 
129
<com:TTextHighlighter CssClass="source" Language="php">
130
class PostRecord extends TActiveRecord
131
{
132
    //... propriétés et méthodes comme précédemment
133
 
134
    public $author; //contient un objet UserRecord
135
 
136
    public static $RELATIONS=array
137
    (
138
        'author' => array(self::BELONGS_TO, 'UserRecord'),
139
    );
140
}
141
</com:TTextHighlighter>
142
 
143
<p>
144
La propriété statique <tt>$RELATIONS</tt> de la classe <tt>PostRecord</tt> définit que la propriété <tt>$author</tt> fait référence à un <tt>UserRecord</tt>. Dans le tableau : <tt>array(self::BELONGS_TO, 'UserRecord')</tt>, le premier élément défini le type de relation, dans notre cas, <tt>self::BELONGS_TO</tt>. Le deuxième élément est le nom de l'objet en relation, dans notre cas <tt>UserRecord</tt>. La classe <tt>UserRecord</tt> est définie comme ci-dessous, la différence est que chaque objet <tt>UserRecord</tt> contient plusieurs <tt>PostRecord</tt>.
145
</p>
146
 
147
<com:TTextHighlighter CssClass="source" Language="php">
148
class UserRecord extends TActiveRecord
149
{
150
    //... propriétés et méthodes comme précédemment
151
 
152
    public $posts=array(); //contient un tableau de PostRecord
153
 
154
    public static $RELATIONS=array
155
    (
156
        'posts' => array(self::HAS_MANY, 'PostRecord'),
157
    );
158
}
159
</com:TTextHighlighter>
160
 
161
<p>
162
Un tableau de <tt>UserRecord</tt> ainsi que les messages correspondants peuvent être lu de la manière suivante :
163
</p>
164
 
165
<com:TTextHighlighter CssClass="source" Language="php">
166
$users = UserRecord::finder()->withPosts()->findAll();
167
</com:TTextHighlighter>
168
 
169
<com:TipBox>
170
La méthode <tt>withXXX()</tt> (avec XXX qui est le nom de la propriété de la relation, dans notre cas <tt>Posts</tt>) lit les données correspondantes de <tt>PostRecords</tt> en utilisant une deuxième requête (mais pas en utilisant une jointure). La méthode <tt>withXXX()</tt> accepte les mêmes arguments que les autres méthodes <tt>finder</tt> de l'objet Active record, ie : <tt>withPosts('status = ?', 0)</tt>.
171
</com:TipBox>
172
 
173
<p>
174
Plus d'informations sont disponibles dans le manuel de démarrage rapide <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
175
</p>
176
 
177
</com:TContent>