From 21a0a5ef7935a56c9d9d95562394bc61b7bcebf1 Mon Sep 17 00:00:00 2001 From: kabayan <> Date: Wed, 24 Oct 2007 23:02:15 +0000 Subject: Indonesian: Synchronized with english version --- .../protected/pages/Database/id/ActiveRecord.page | 84 ++++++++++++++++------ 1 file changed, 63 insertions(+), 21 deletions(-) (limited to 'demos/quickstart') diff --git a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page b/demos/quickstart/protected/pages/Database/id/ActiveRecord.page index 7273640d..a779a1da 100644 --- a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page +++ b/demos/quickstart/protected/pages/Database/id/ActiveRecord.page @@ -5,7 +5,7 @@

Rekaman Aktif adalah obyek yang melapisi baris dalam tabel atau view database, melindungi akses database dan menambahkan logika domain pada data tersebut. Dasar dari Rekaman Aktif adalah kelas bisnis, sebagai contoh, kelas - Products, yang hampir menyamai struktur rekaman dari tabel database + Products, yang hampir menyamai struktur rekaman dari tabel database dibawahnya. Setiap Rekaman Aktif akan bertanggung jawab atas penyimpanan dan pengambilan data ke dan dari database.

Info: @@ -42,7 +42,7 @@

Implikasi Desain

-Implementasi Prado terhadap Rekaman Aktif tida memelihara identitas referensial. Setiap obyek diperoleh menggunakan Rekaman Aktif pada data dalam database. Sebagai contoh, jika anda meminta kustomer tertentu dan mendapaptkan kembali obyek Customer, kali berikutnya anda meminta kustomer itu anda akan kembali mendapatkan turunan lain dari obyek Customer. Ini berarti bahwa perbandingan tepat (misalnya menggunakan ===) akan mengembalikan false, sementara perbandingan bebas (misalnya menggunakan ==) akan mengembalikan true jika nilai obyek sama menurut perbandingan bebas. +Implementasi Prado terhadap Rekaman Aktif tidak memelihara identitas referensial. Setiap obyek diperoleh menggunakan Rekaman Aktif pada data dalam database. Sebagai contoh, jika anda meminta kustomer tertentu dan mendapatkan kembali obyek Customer, kali berikutnya anda meminta kustomer itu, anda akan kembali mendapatkan turunan lain dari obyek Customer. Ini berarti bahwa perbandingan tepat (misalnya menggunakan ===) akan mengembalikan false, sementara perbandingan bebas (misalnya menggunakan ==) akan mengembalikan true jika nilai obyek sama menurut perbandingan bebas.

Implikasi desain ini terkait dengan pertanyaan berikut. @@ -128,7 +128,7 @@ class UserRecord extends TActiveRecord { }

Lebih jelas mengenai TComponent dapat ditemukan dalam Dokumentasi komponen. -Nantinya kita harus dapat menggunakan pengambil/penentu guna membolehkan pengambilan lazy dari obyek yang berhubungan. +Nantinya kita harus dapat menggunakan pengambil/penyetel guna membolehkan pengambilan malas atas obyek yang berhubungan.

Info: @@ -549,7 +549,7 @@ class TeamRecord extends TActiveRecord public $name; public $location; - public $players=array(); + public $players=array(); // deklarasi ini tidak diperlukan lagi sejak v3.1.2 //mendefinisikan anggota $player yang memiliki hubungan banyak dengan PlayerRecord public static $RELATIONS=array @@ -570,12 +570,37 @@ Dalam array(self::HAS_MANY, 'PlayerRecord'), elemen pertama mendefinisi Elemen kedua adalah string 'PlayerRecord' yang menunjukan nama kelas dari kelas PlayerRecord.

+
Catatan: +Seperti dijelaska dalam komentar kode di atas, sejak versi 3.1.2, properti terkait tidak tidak lagi perlu dideklarasikan secara eksplisit. Standarnya, akan secara implisit dideklarasikan berdasarkan pada kunci array $RELATIONS. Keuntungan utama atas properti terkait yang dideklarasikan secara implisit adalah obyek terkait dapat diambil secara otomatis dengan cara malas. Sebagai contoh, anggap kita mempunyai TeamRecord turunan $team. Kita dapat mengakses players via $team->players, +meskipun kita tidak pernah menerbitkan perintah mengambil untuk players. Jika $players dideklarasikan secara eksplisit, kita harus menggunakan pendekatan with seperti dijelaskan dalam contoh berikut untuk mengambil rekaman player. +
+

Batasan kunci asing tabel Players dipakai untuk menentukan nama kunci tabel Teams terkait. Ini dikerjakan secara otomatis, ditangani dalam Rekaman Aktif dengan memeriksa definisi tabel Players dan Teams.

Info: -Rekaman Aktif mendukung hubungan kunci asing multipel tabel dengan batasan bahwa setiap hubungan menunjukan tabel yang unik. Sebagai contoh, tabel Players hanya dapat memiliki satu set hubungan kunci asing dengan tabel Teams, ia boleh mempunyai hubungan lain yang menunjuk ke tabel lainnya (termasuk tabel Players itu sendiri). +Sejak versi 3.1.2, Rekaman Aktif mendukung multipel referensi kunci asing pada tabel yang sama. Kerancuan diantara multipel referensi kunci asing dipecahkan dengan penyediaan nama kolom kunci asing sebagai parameter ke-3 dalam array relationship. +Sebagai contoh, kedua kunci asing owner_id dan reporter_id +merujuk tabel yang sama, didefinisikan dalam UserRecord. + +class TicketRecord extends TActiveRecord +{ + public $owner_id; + public $reporter_id; + + public $owner; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 + public $reporter; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 + + public static $RELATION=array + ( + 'owner' => array(self::BELONGS_TO, 'UserRecord', 'owner_id'), + 'reporter' => array(self::BELONGS_TO, 'UserRecord', 'reporter_id'), + ); +} + +Ini berlaku untuk hubungan termasuk BELONGS_TO, HAS_ONE dan +HAS_MANY. Lihat seksi Tabel Asosiaasi Merujuk Dirinya Sendiri untuk memecahkan kerancuan atas hubungan MANY_TO_MANY.

Hubungan "has many" tidak diambil secara otomatis ketika anda menggunakan salah satu metode finder Rekaman Aktif. @@ -595,6 +620,11 @@ Query kedua dipakai untuk mengambil obyek PlayerRecord terkait. Penggunaan dua query mirip dengan query tunggal menggunakan Left-Outer join dengan eksepsi bahwa hasil null pada tabel kanan tidak dikembalikan. Konsekuensi pemakaian dua tau lebih query adalah kondisi agregat dan join tidak layak menggunakan Rekaman Aktif. Untuk query di luar lingkup Rekaman Aktif, Pemeta Data SqlMap diapat dupertimbangkan.

+
Info: +Pendekatan with di atas juga bekerja dengan properti terkait yang dideklarasikan secara implisit (diperkenalkan dalam versi 3.1.2). Lalu apa perbedaan antara pendekatan with dan pendekatan pengambilan malas? Pengambilan malas berarti kita menerbitkan query SQL jika obyek terkait awalnya diakses dan tidak siap, +sementara query pendekatan with untuk obyek terkait sekaligus, tida peduli obyek terkait diakses atau tidak. Pendekatan pengambilan malas sangat cocok karena kita tidak perlu secara eksplisit mengambil obyek terkait, sementara pendekatan with lebih efisien jika multipel rekaman yang dikembalikan, masing-masing dengan beberapa obyek terkait. +
+

Hubungan Belongs To

Hubungan "has many" dalam bagian di atas mendefinisikan koleksi obyek asing. Dalam keadaan tertentu, kita mempunyai TeamRecord memiliki banyak (nol atau lebih) obyek PlayerRecord. Kita juga dapat menambah penunjuk kembali dengan menambahkan properti dalam kelas PlayerRecord yang mengaitkan kembali ke obyek TeamRecord, secara efektif membuat asosiasi dua arah. Kita katakan bahwa properti $team dalam kelas PlayerRecord belongs to obyek TeamRecord. @@ -604,9 +634,9 @@ Kode berikut mendefinisikan kelas PlayerRecord lengkap dengan 3 hubunga class PlayerRecord extends TActiveRecord { const TABLE='Players'; - public $player_id; - public $age; - public $team_name; + public $player_id; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 + public $age; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 + public $team_name; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 public $team; public $skills=array(); @@ -656,7 +686,7 @@ class ProfileRecord extends TActiveRecord public $player_id; public $salary; - public $player; + public $player; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 public static $RELATIONS=array ( @@ -695,8 +725,8 @@ class Category extends TActiveRecord public $category_name; public $parent_cat_id; - public $parent_category; - public $child_categories=array(); + public $parent_category; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 + public $child_categories=array(); // deklarasi ini tidak diperlukan lagi sejak v3.1.2 public static $RELATIONS=array ( @@ -722,7 +752,7 @@ Anggap pengambilan koleksi SkillRecord untuk daftar obyek PlayerRec Dalam hal ini, anda melakukan query dalam dua tahap. Tahap pertama meng-query tabel Players untuk mencari seluruh baris dari pemain yang anda inginkan. Tahap kedua mencari obyek SkillRecord ID pemain terkait untuk setiap barisnya dalam tabel asosiasi Player_Skills menggunakan sebuah inner join.

-

Desain Rekaman Aktif Prado mengimplementasikan dua tahap pendekatan. Untuk hubungan entitas Players-Skills M-N (banyak-ke-banyak), kita perlu mendefinisikan sebuah hubungan has many dalam kelas PlayerRecord dan sebagai tambahan mendefinisikan hubungan has many dalam kelas SkillRecord juga. +

Desain Rekaman Aktif Prado mengimplementasikan dua tahap pendekatan. Untuk hubungan entitas Players-Skills M-N (many-to-many), kita perlu mendefinisikan sebuah hubungan has many dalam kelas PlayerRecord dan sebagai tambahan mendefinisikan hubungan has many dalam kelas SkillRecord juga. Kode contoh berikut mendefinisikan kelas SkillRecord lengkap dengan hubungan banyak-ke-banyak dengan kelas PlayerRecord. (Lihat definisi kelas PlayerRecord di atas untuk mengaitkan hubungan banyak-ke-banyak dengan kelas SkillRecord.)

@@ -733,7 +763,7 @@ class SkillRecord extends TActiveRecord public $skill_id; public $name; - public $players=array(); + public $players=array(); // deklarasi ini tidak diperlukan lagi sejak v3.1.2 public static $RELATIONS=array ( @@ -752,6 +782,11 @@ Properti statis $RELATIONS dari SkillRecord mendefinisikan bahwa proper Dalam array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills'), elemen pertama mendefinisikan tipe hubungan, dalam hal ini self::HAS_MANY, elemen kedua adalah string 'PlayerRecord' yang terkait ke nama kelas dari kelas PlayerRecord, dan elemen ketiga adalah nama dari nama tabel asosiasi.

+ +
Catatan: +Sebelum versi 3.1.2 (versi sampai dengan 3.1.1), hubungan many-to-many didefinisikan menggunakan self::HAS_MANY. Untuk versi 3.1.2 dan seterusnya, ini harus diubah ke self::MANY_TO_MANY. Ini bisa dikerjakan dengan mencari HAS_MANY dalam kode sumber dan hati-hati mengubah definisi terkait. +
+

Daftar obyek pemain dengan koleksi obyek skil terkait bisa diambil seperti berikut.

@@ -801,7 +836,7 @@ class Item extends TActiveRecord //id item asing tambahan didefinisikan dalam tabel asosiasi public $related_item_id; - public $related_items=array(); + public $related_items=array(); // deklarasi ini tidak diperlukan lagi sejak v3.1.2 public static $RELATIONS=array ( @@ -814,6 +849,7 @@ class Item extends TActiveRecord Kunci gabungan dalam tabel asing dapat ditetapkan sebagai nilai dipisahkan koma diantara kurung buka/tutup. Contohnya 'related_items.(id1,id2)'.
+ + +

Pengambilan Malas Obyek Terkait

+ +
Catatan: +Secara implisit mendeklarasikan properti terkait yang diperkenalkan dalam versi 3.1.2 secara otomatis memiliki fitur pengambilan malas. Oleh karena itu, teknik pengambilan malas dijelaskan berikut ini tidak lagi diperlukan dalam banyak kasus, kecuali anda ingin memanipulasi obyek terkait melalui pengambil/penyetel. +
-

Lazy Loading Terkait Obyek

Menggunakan metode with_xxx() akan mengambil hubungan rekaman sesuai permintaan. Mengambil rekaman terkait dengan lazy loading (yaitu, hanya obyek terkait itu saja yang diakses) bisa dicapai dengan menggunakan sebuah fitur TComponent yang menyediakan metode pengakses. Dalam keadaan tertentu, kita mendefinisikan pasangan metode pengambil dan penentu di mana metode pengambil akan mengambil hubungan secara kondisional. Contoh berikut menggambarkan bahwa PlayerRecord dapat mengambil obyek asing $skills secara kondisional.

@@ -875,12 +917,12 @@ class PlayerRecord extends BaseFkRecord } } -

Pertama kita perlu mengubah deklarasi $skills=array() ke properti privat $_skills (perhatikan garis bawah) dan sebaliknya setel ke null. Ini membolehkan kita untuk mendifinisikan properti skills menggunakan metode pengambil/penentu -(lihat Komponen untuk lebih jelasnya). Metode pengambil getSkills() untuk properti skills akan mengambil lambat rekaman skill terkait saat ia dipakai sebagai berikut. Catatan bahwa kita hanya melakukan pengambilan lambat ketika $player_id tidak null (ykni, ketika rekaman sudah diambil dari database ataau id player sudah disetel). +

Pertama kita perlu mengubah deklarasi $skills=array() ke properti private $_skills (perhatikan garis bawah) dan sebaliknya setel ke null. Ini membolehkan kita untuk mendefinisikan properti skills menggunakan metode pengambil/penyetel +(lihat Komponen untuk lebih jelasnya). Metode pengambil getSkills() untuk properti skills akan mengambil malas rekaman skill terkait saat ia dipakai sebagai berikut. Catatan bahwa kita hanya melakukan pengambilan malas ketika $player_id tidak null (yakni, ketika rekaman sudah diambil dari database ataau id player sudah disetel).

$player = PlayerRecord::finder()->findByPk(1); -var_dump($player->skills); //mengambilnya saat akses pertama +var_dump($player->skills); //pengambilan malas saat akses pertama var_dump($player->skills[0]); //properti skills sudah diambil $player->skills[] = new SkillRecord(); //menambah skill @@ -927,11 +969,11 @@ class UserRecord extends TActiveRecord }

-Dengan pemetaan kolom di atas, kita menambahkan alamat first_name menggunakan $userRecord->firstName +Dengan pemetaan kolom di atas, kita mengalamatkan first_name menggunakan $userRecord->firstName daripada $userRecord->first_name. Ini membantu pemisahan dari logika dan model.

-

References

+

Referensi

-
$Id: ActiveRecord.page 2262 2007-09-28 18:26:03Z xue $
\ No newline at end of file +
$Id: ActiveRecord.page 2323 2007-10-21 20:52:05Z xue $
\ No newline at end of file -- cgit v1.2.3