Membuat Kelas Rekaman Aktif

Kita perlu membuat dua kelas Rekaman Aktif, UserRecord dan PostRecord, masing-masing untuk mewakili rekaman data dalam tabel users dan posts. Kelas Rekaman Aktif harus diperluas dari kelas basis ActiveRecord, dan harus mendefinisikan nama properti yang sama dengan nama field dari tabel terkait.

Untuk mengatur lebih baik direktori, kita membuat direktori baru protected/database guna menampung file kelas. Kita juga memodifikasi konfigurasi aplikasi kita dengan menyisipkan baris berikut. Ini sama dengan menambahkan direktori protected/database ke PHP include_path, yang membolehkan kita untuk menggunakan kelas tanpa secara eksplisit menyertakannya.

Daripada menulis kelas secara manual, kita akan menggunakan piranti baris perintah PRADO lagi untuk membuat kelas bagi kita.

Di bawah direktori blog, jalankan perintah berikut untuk masuk ke dalam mode interaktif pada piranti baris perintah:

php path/ke/prado-cli.php shell .

Kita akan melihat

Command line tools for Prado 3.1.0. ** Loaded PRADO appplication in directory "protected". PHP-Shell - Version 0.3.1 (c) 2006, Jan Kneschke >> use '?' to open the inline help >>

Pada prompt, masukkan dua perintah berikut untuk membuat kelas UserRecord dan PostRecord:

>> generate users Application.database.UserRecord >> generate posts Application.database.PostRecord

Di sini kita menggunakan format namespace lagi untuk menetapkan kelas yang dibuat. Path Application.database.UserRecord menunjukan bahwa kita ingin file kelas UserRecord menjadi protected/database/UserRecord.php.

Kita akan melihat struktur direktori berikut dengan dua file baru di bawah protected/database:

Jika kita memeriksa file kelas PostRecord, kita akan melihat konten berikut.

class PostRecord extends TActiveRecord { const TABLE='posts'; public $post_id; public $author_id; public $create_time; public $title; public $content; public $status; public static function finder($className=__CLASS__) { return parent::finder($className); } }

Seperti kita lihat, untuk setiap field dalam tabel posts, kelas mempunyai anggota data terkait. Konstan TABLE menetapkan nama tabel untuk PostRecord. Metode statis finder() membolehkan kita melakukan query dan mengambil data tulisan dalam batasan obyek PostRecord.

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 UserRecord::finder()->findAll().

>> PostRecord::finder()->findAll() array ( [0] => PostRecord#1 ( [post_id] => '1' [author_id] => 'admin' [create_time] => '1175708482' [title] => 'first post' [content] => 'this is my first post' [status] => '0' [TActiveRecord:_readOnly] => false [TActiveRecord:_connection] => null [TComponent:_e] => array() ) )

Hubungan Antara Tulisan dan Pengguna

Mengingat bahwa ada hubungan kunci asing antara tabel users dan posts. Diagram hubungan-entitas ditampilkan di bawah ini demi kenyamanan.

Dari diagram hubungan-entitas di atas, kita merlihat bahwa tabel posts berisi field bernama author_id. Field author_id ini adalah kunci asing yang mereferensi tabel users. Dalam keadaan tertentu, nilai dalam field author_id seharusnya dari tabel users field username. Salah satu konsekuensi dari hubungan ini, dalam pola pikir obyek, adalah bahwa setiap "tulisan" milik "author" dan satu "author" dapat memiliki banyak "tulisan".

Kita dapat membuat model hubungan antara tabel posts dan users dalam Rekaman Aktif dengan memodifikasi kelas PostRecord dan UserRecord seperti berikut.

class PostRecord extends TActiveRecord { //... properti dan metode seperti sebelumnya public $author; //menampung array UserRecord public static $RELATIONS=array ( 'author' => array(self::BELONGS_TO, 'UserRecord'), ); }

Properti statis $RELATIONS pada PostRecord mendefinisikan bahwa properti $author dimiliki UserRecord. Dalam array(self::BELONGS_TO, 'UserRecord'), elemen pertama mendefinisikan tipe hubungan, dalam hal ini self::BELONGS_TO. Elemen kedua adalah nama pada rekaman terkait, dalam hal ini UserRecord. UserRecord didefinisikan sama di bawah ini, perbedaannya yaitu rekaman pengguna mempunyai banyak PostRecord.

class UserRecord extends TActiveRecord { //... properti dan metode seperti seblumnya public $posts=array(); //menampung array PostRecord public static $RELATIONS=array ( 'posts' => array(self::HAS_MANY, 'PostRecord'), ); }

Sebuah array UserRecord dengan dan tulisan terkaitnya dapat diambil seperti berikut.

$users = UserRecord::finder()->withPosts()->findAll(); Metode withXXX() (di mana XXX adalah nama properti hubungan, dalam hal ini, Posts) mengambil PostRecords terkait menggunakan query kedua (tidak dengan menggunakan join). Metode withXXX() menerima argumen yang sama sebagai finder lain dari TActiveRecord, misalhnya withPosts('status = ?', 0).

Dokumentasi lengkap selanjutnya dapat ditemukan dalam dokumen quickstart Rekaman Aktif.