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>Membuat Kelas Rekaman Aktif</h1>
4
 
5
<p>
6
Kita perlu membuat dua kelas <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a>, <tt>UserRecord</tt> dan <tt>PostRecord</tt>, masing-masing untuk mewakili rekaman data dalam tabel <tt>users</tt> dan <tt>posts</tt>. Kelas Rekaman Aktif harus diperluas dari kelas basis <tt>ActiveRecord</tt>, dan harus mendefinisikan nama properti yang sama dengan nama field dari tabel terkait.
7
</p>
8
 
9
<p>
10
Untuk mengatur lebih baik direktori, kita membuat direktori baru <tt>protected/database</tt> guna menampung file kelas. Kita juga memodifikasi konfigurasi aplikasi kita dengan menyisipkan baris berikut. Ini sama dengan menambahkan direktori <tt>protected/database</tt> ke PHP include_path, yang membolehkan kita untuk menggunakan kelas tanpa secara eksplisit menyertakannya.
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
Daripada menulis kelas secara manual, kita akan menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">piranti baris perintah PRADO</a> lagi untuk membuat kelas bagi kita.
21
</p>
22
 
23
<p>
24
Di bawah direktori <tt>blog</tt>, jalankan perintah berikut untuk masuk ke dalam mode interaktif pada piranti baris perintah:
25
</p>
26
 
27
<com:TTextHighlighter CssClass="source cli" Language="text">
28
php path/ke/prado-cli.php shell .
29
</com:TTextHighlighter>
30
 
31
<p>
32
Kita akan melihat
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
Pada prompt, masukkan dua perintah berikut untuk membuat kelas <tt>UserRecord</tt> dan <tt>PostRecord</tt>:
48
</p>
49
 
50
<com:TTextHighlighter CssClass="source cli">
51
>> generate users Application.database.UserRecord
52
 
53
>> generate posts Application.database.PostRecord
54
</com:TTextHighlighter>
55
 
56
<p>
57
Di sini kita menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">format namespace</a> lagi untuk menetapkan kelas yang dibuat. Path <tt>Application.database.UserRecord</tt> menunjukan bahwa kita ingin file kelas <tt>UserRecord</tt> menjadi <tt>protected/database/UserRecord.php</tt>.
58
</p>
59
 
60
<p>
61
Kita akan melihat struktur direktori berikut dengan dua file baru di bawah <tt>protected/database</tt>:
62
</p>
63
 
64
<img src="<%~ directories2.gif %>" class="output" />
65
 
66
<p>
67
Jika kita memeriksa file kelas <tt>PostRecord</tt>, kita akan melihat konten berikut.
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
Seperti kita lihat, untuk setiap field dalam tabel <tt>posts</tt>, kelas mempunyai anggota data terkait. Konstan <tt>TABLE</tt> menetapkan nama tabel untuk <tt>PostRecord</tt>. Metode statis <tt>finder()</tt> membolehkan kita melakukan query dan mengambil data tulisan dalam batasan obyek <tt>PostRecord</tt>.
90
</p>
91
 
92
<p>
93
Kita dapat menggunakan piranti baris perintah untuk melakukan beberapa pengujian dengan kelas Rekaman Aktif yang baru saja kita buat. Masih dalam mode interaktif pada piranti baris perintah, kita memasukan pernyataan PHP dan seharusnya melihat kode berikut. Para pembaca yang tertarik dapat mencoba pernyataan PHP laninnya, seperti misalnya <tt>UserRecord::finder()->findAll()</tt>.
94
</p>
95
 
96
<com:TTextHighlighter CssClass="source" Language="php">
97
>> PostRecord::finder()->findAll()
98
array
99
(
100
    [0] => PostRecord#1
101
    (
102
        [post_id] => '1'
103
        [author_id] => 'admin'
104
        [create_time] => '1175708482'
105
        [title] => 'first post'
106
        [content] => 'this is my first post'
107
        [status] => '0'
108
        [TActiveRecord:_readOnly] => false
109
        [TActiveRecord:_connection] => null
110
        [TComponent:_e] => array()
111
    )
112
)
113
</com:TTextHighlighter>
114
 
115
<h1>Hubungan Antara Tulisan dan Pengguna</h1>
116
<p>
117
Mengingat bahwa ada hubungan kunci asing antara tabel <tt>users</tt> dan <tt>posts</tt>. Diagram hubungan-entitas ditampilkan di bawah ini demi kenyamanan.
118
</p>
119
 
120
<img src="<%~ ER.gif %>" class="output" />
121
 
122
<p>
123
Dari diagram hubungan-entitas di atas, kita merlihat bahwa tabel <tt>posts</tt> berisi field bernama <tt>author_id</tt>. Field <tt>author_id</tt> ini adalah kunci asing yang mereferensi tabel <tt>users</tt>. Dalam keadaan tertentu, nilai dalam field <tt>author_id</tt> seharusnya dari tabel <tt>users</tt> field <tt>username</tt>. Salah satu konsekuensi dari hubungan ini, dalam pola pikir obyek, adalah bahwa setiap "tulisan" milik "author" dan satu "author" dapat memiliki banyak "tulisan".
124
</p>
125
 
126
<p>
127
Kita dapat membuat model hubungan antara tabel <tt>posts</tt> dan <tt>users</tt> dalam Rekaman Aktif dengan memodifikasi kelas <tt>PostRecord</tt> dan <tt>UserRecord</tt> seperti berikut.
128
</p>
129
 
130
<com:TTextHighlighter CssClass="source" Language="php">
131
class PostRecord extends TActiveRecord
132
{
133
    //... properti dan metode seperti sebelumnya
134
 
135
    public $author; //menampung array UserRecord
136
 
137
    public static $RELATIONS=array
138
    (
139
        'author' => array(self::BELONGS_TO, 'UserRecord'),
140
    );
141
}
142
</com:TTextHighlighter>
143
 
144
<p>
145
Properti statis <tt>$RELATIONS</tt> pada <tt>PostRecord</tt> mendefinisikan bahwa properti <tt>$author</tt> dimiliki <tt>UserRecord</tt>. Dalam <tt>array(self::BELONGS_TO, 'UserRecord')</tt>, elemen pertama mendefinisikan tipe hubungan, dalam hal ini <tt>self::BELONGS_TO</tt>. Elemen kedua adalah nama pada rekaman terkait, dalam hal ini <tt>UserRecord</tt>. <tt>UserRecord</tt> didefinisikan sama di bawah ini, perbedaannya yaitu rekaman pengguna mempunyai banyak <tt>PostRecord</tt>.
146
</p>
147
 
148
<com:TTextHighlighter CssClass="source" Language="php">
149
class UserRecord extends TActiveRecord
150
{
151
    //... properti dan metode seperti seblumnya
152
 
153
    public $posts=array(); //menampung array PostRecord
154
 
155
    public static $RELATIONS=array
156
    (
157
        'posts' => array(self::HAS_MANY, 'PostRecord'),
158
    );
159
}
160
</com:TTextHighlighter>
161
 
162
<p>
163
Sebuah array <tt>UserRecord</tt> dengan dan tulisan terkaitnya dapat diambil seperti berikut.
164
</p>
165
 
166
<com:TTextHighlighter CssClass="source" Language="php">
167
$users = UserRecord::finder()->withPosts()->findAll();
168
</com:TTextHighlighter>
169
 
170
<com:TipBox>
171
Metode <tt>withXXX()</tt> (di mana XXX adalah nama properti hubungan, dalam hal ini, <tt>Posts</tt>) mengambil <tt>PostRecords</tt> terkait menggunakan query kedua (tidak dengan menggunakan join). Metode <tt>withXXX()</tt> menerima argumen yang sama sebagai finder lain dari TActiveRecord, misalhnya <tt>withPosts('status = ?', 0)</tt>.
172
</com:TipBox>
173
 
174
<p>
175
Dokumentasi lengkap selanjutnya dapat ditemukan dalam dokumen quickstart <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a>.
176
</p>
177
 
178
</com:TContent>