From 6a0174448c793cb071e1e6d12f3da3a65eeb4e15 Mon Sep 17 00:00:00 2001 From: kabayan <> Date: Wed, 31 Oct 2007 20:41:11 +0000 Subject: Indonesian: Huge typos corrections and more formal language. --- .../protected/pages/Database/id/ActiveRecord.page | 44 +++++++++++----------- 1 file changed, 22 insertions(+), 22 deletions(-) (limited to 'demos/quickstart/protected/pages/Database/id/ActiveRecord.page') diff --git a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page b/demos/quickstart/protected/pages/Database/id/ActiveRecord.page index a779a1da..a171ed7d 100644 --- a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page +++ b/demos/quickstart/protected/pages/Database/id/ActiveRecord.page @@ -19,20 +19,20 @@ seperti membuat, membaca, memutakhirkan, dan menghapus. Derivasi dan validasi didasarkan pada satu rekaman yang bekerja denga baik dalam struktur ini. Rekaman Aktif mempunyai kuntungan utama dalam hal kesederhanaan. Mudah untuk membangun Rekaman Aktif, dan mudah untuk dimengerti.

-

Akan tetapi, seiring dengan perkembangan logika bisnis anda dalm hal kompleksitas, anda akan segera ingin menggunakan hubungan langsung obyek anda, koleksi, turunan, dan seterusnya. Ini tidak mudah diterapkan ke dalam Rekaman Aktif, dan menambahkannya sedikit demi sedikit menjadi sangat kacau. +

Akan tetapi, seiring dengan perkembangan logika bisnis Anda dalm hal kompleksitas, Anda akan segera ingin menggunakan hubungan langsung obyek Anda, koleksi, turunan, dan seterusnya. Ini tidak mudah diterapkan ke dalam Rekaman Aktif, dan menambahkannya sedikit demi sedikit menjadi sangat kacau. Argumen lain terhadap Rekaman Aktif adalah kenyataan bahwa ia menyandingkan desin obyek ke desain database. Ini menjadikannya lebih sulit untuk merefraktorisasi karena proyek terus berjalan.

Alternatifnya adalah menggunakan Pemeta Data yang yang memisahkan aturan dari obyek bisnis dan bagaimana obyek ini disimpan. Prado menyediakan pilihan tambahan antara Rekaman Aktif dan Pemeta Data SqlMap. Pemeta Data SqlMap bisa dipakai untuk mengambil obyek Rekaman Aktif, hasilnya; obyek Rekaman Aktif ini bisa dipakai untuk memutakhirkan database. - "Hubungan" andara Rekaman Aktif dan SqlMap digambarkan dalam diagram berikut. Lebih rinci mengenai Pemeta Data SqlMap dapat ditemukan dalam + "Hubungan" antara Rekaman Aktif dan SqlMap digambarkan dalam diagram berikut. Lebih rinci mengenai Pemeta Data SqlMap dapat ditemukan dalam Manual SqlMap. alt="Rekaman Aktif dan SqlMap DataMapper" id="fig:diagram.png" class="figure"/>

- Kelas Rekaman Aktif mempunyai fungsionalitas untuk melakukan tugas-tugas berikut. + Kelas Rekaman Aktif berfungsi untuk melakukan tugas-tugas berikut.

Implikasi Desain

-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. +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. "Anda pikir kustomer sebagai obyek, di mana hanya satu, -atau anda pikir obyek yang anda operasikan sebagai duplikat dari database?" +atau Anda pikir obyek yang Anda operasikan sebagai duplikat dari database?" Pemetaan O/R lain akan mengartikan bahwa hanya ada satu obyek Kustomer dengan custID 100, dan secara literal ia adalah kustomer. -Jika anda mendapatkan kustomer dan mengubah field-nya, maka anda sekarang telah mengubah kustomer itu. -"Itu berbatasan dengan: anda telah mengubah duplikat kustomer ini, tapi bukan pada duplikat itu. +Jika Anda mendapatkan kustomer dan mengubah field-nya, maka Anda sekarang telah mengubah kustomer itu. +"Itu berbatasan dengan: Anda telah mengubah duplikat kustomer ini, tapi bukan pada duplikat itu. Dan jika dua orang memutakhirkan kustomer pada dua duplikat obyek, siapapun yang memutakhirkan pertama kali, atau mungkin yang terakhir yang menang." [A. Hejlsberg 2003]

@@ -101,10 +101,10 @@ class UserRecord extends TActiveRecord

Setiap kolom dari tabel "users" harus mempunyai properti terkait atas nama yang sama seperti nama kolom dalam kelas UserRecord. - Tentunya, anda juga mendefinisikan variabel atau properti tambahan yang tidak ada dalam struktur tabel. + Tentunya, Anda juga mendefinisikan variabel atau properti tambahan yang tidak ada dalam struktur tabel. Konstan kelas TABLE adalah opsional saat nama kelas adalah sama seperti nama tabel dalam database, sebaliknya TABLE harus - menetapkan nama tabel yang terkait dengan kelas Rekaman Aktif anda. + menetapkan nama tabel yang terkait dengan kelas Rekaman Aktif Anda.

Tip: @@ -112,7 +112,7 @@ Anda dapat menetapkan nama-nama tabel yang memenuhi syarat. Contohnya untuk MySQ

- Karena TActiveRecord memperluas TComponent, metode penentu dan pengambil dapat didefinisikan guna membolehkan kontrol melalui bagaimana variabel disetel dan dikembalikan. Sebagai contoh, menambah properti $level untuk menggunakan kelas UserRecord: + Karena TActiveRecord memperluas TComponent, metode penyetel dan pengambil dapat didefinisikan guna membolehkan kontrol melalui bagaimana variabel disetel dan dikembalikan. Sebagai contoh, menambah properti $level untuk menggunakan kelas UserRecord:

class UserRecord extends TActiveRecord { @@ -155,7 +155,7 @@ $conn = new TDbConnection($dsn, 'dbuser','dbpass'); TActiveRecordManager::getInstance()->setDbConnection($conn); -

Alternatifnya, anda dapat membuat basis kelas dan mengganti metode getDbConnection() untuk mengembalikan +

Alternatifnya, Anda dapat membuat basis kelas dan mengganti metode getDbConnection() untuk mengembalikan koneksi database. Ini adalah cara sederhana untuk mengijinkan koneksi database multipel. Kode berikut mendemonstrasikan penetapan koneksi database dalam sebuah basis kelas (tidak perlu menyetel koneksi DB di manapun juga).

@@ -196,7 +196,7 @@ class MyDb2Record extends TActiveRecord
Tip: - Atribut EnableCache ketika disetel ke "true" akan melakukan cache meta data tabel, yakni nama kolom tabel, indeks dan batasan yang disimpan dalam cache dan dipakai ulang. Anda harus membersihkan atau mematikan cache jika anda ingin melihat perubahan terhadap definisi tabel anda. Modul cache juga harus didefinisikan agar cache berfungsi. + Atribut EnableCache ketika disetel ke "true" akan melakukan cache meta data tabel, yakni nama kolom tabel, indeks dan batasan yang disimpan dalam cache dan dipakai ulang. Anda harus membersihkan atau mematikan cache jika Anda ingin melihat perubahan terhadap definisi tabel Anda. Modul cache juga harus didefinisikan agar cache berfungsi.

@@ -369,7 +369,7 @@ $user2->save(); //sisipkan rekaman baru
Tip: Obyek dimutakhirkan dengan kunci primer dari tabel itu yang berisi definisi yang secara otomatis membuat kunci primer untuk rekaman yang baru saja disisipkan. -Sebagai contoh, jika anda menyisipkan sebuah rekaman baru ke dalam tabel MySQL yang kolomnya didefinisikan dengan "autoincrement", obyek Rekaman Aktif akan dimutakhirkan dengan nilai yang ditambahkan.
+Sebagai contoh, jika Anda menyisipkan sebuah rekaman baru ke dalam tabel MySQL yang kolomnya didefinisikan dengan "autoincrement", obyek Rekaman Aktif akan dimutakhirkan dengan nilai yang ditambahkan.

Untuk memutakhirkan rekaman dalam database, cukup ubah satu atau lebih properti obyek Rekaman Aktif yang sudah diambil dari database dan kemudian panggil metode save(). @@ -387,7 +387,7 @@ Obyek Rekaman Aktif mempunyai masa-hidup sederhana seperti digambarkan dalam dia alt="Active Records Life Cycle" id="fig:cycle.png" class="figure"/>

Kita melihat bahwa obyek TActiveRecord baru dibuat dengan menggunakan salah satu metode find*() ataupun membuat turunan baru dengan menggunakan kata kunci PHP new. Obyek yang dibuat dengan metode find*() dimulai dengan kondisi clean. Turunan baru TActiveRecord membuat selain metode find*() yang dimulai dengan kondisi new. -Kapan saja anda memanggil metode save() pada obyek TActiveRecord, obyek memasuki keadaan clean. Obyek dalam clean menjadi dirty ketika satu atau lebih keadaan internalnya diubah. Pemanggilan metode delete() pada obyek mengakhiri masa-hidup obyek, tidak ada aksi lanjutan yang dilakukan pada obyek. +Kapan saja Anda memanggil metode save() pada obyek TActiveRecord, obyek memasuki keadaan clean. Obyek dalam clean menjadi dirty ketika satu atau lebih keadaan internalnya diubah. Pemanggilan metode delete() pada obyek mengakhiri masa-hidup obyek, tidak ada aksi lanjutan yang dilakukan pada obyek.

Menghapus rekaman yang sudah ada

@@ -517,7 +517,7 @@ Dalam bagian berikut kita akan menganggap hubungan tabel antara Ada ketidak cocokan antara hubungan dengan obyek dan hubungan tabel. Pertama, ada perbedaan dalam penyajian. Penghubung kendali obyek dengen menyimpan referensi yang dipegang oleh lingkungan memori-teratur runtime. Database relasional menangani kaitan dengan membentuk sebuah kunci ke dalam tabel lainnya. Keuda, obyek dapat dengan mudah menggunakan koleksi guna menangani multipel referensi dari satu field, sementara normalisasi memaksa seluruh relasi entitas mengaitkan ke nilai tunggal. Ini menyebabkan pembalikan struktur data antara obyek dan tabel. Pendekatan yang diambil dalam desain Rekaman Aktif Prado adalah untuk menggunakan batasan kunci asing guna memperoleh hubungan obyek. Ini berarti bahwa database di bawahnya harus mendukung batasan kunci asing.

Tip: -Untuk database SQLite, anda dapat membuat tabel yang mendefinisikan batasan kunci asing seperti contoh di bawah ini. Akan tetapi, batasan ini TIDAK +Untuk database SQLite, Anda dapat membuat tabel yang mendefinisikan batasan kunci asing seperti contoh di bawah ini. Akan tetapi, batasan ini TIDAK dipaksakan oleh database SQLite itu sendiri. CREATE TABLE foo @@ -603,7 +603,7 @@ 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. +

Hubungan "has many" tidak diambil secara otomatis ketika Anda menggunakan salah satu metode finder Rekaman Aktif. Anda perlu untuk mengambil secara eksplisit obyek terkait seperti berikut. Dalam kode di bawah ini, kedua baris adalah sama dan nama metode tidak sensitif huruf.

@@ -739,7 +739,7 @@ class Category extends TActiveRecord

Pemetaan Tabel Asosiasi

-Obyek dapat dengan mudah menangani field multi nilai dengan menggunakan koleksi sebagai nilai field. Database relasional tidak memiliki fitur ini dan dibatasi hanya ke field nilai-tunggal. Ketika anda memetakan asosiasi satu-ke-banyak, anda bisa menangani ini menggunakan hubungan has many, intinya menggunakan kunci asing untuk nilai-tunggal akhir dari asosiasi. Tapi asosiasi banyak-ke-banyak tidak bisa melakukan ini karena tidak ada nilai-tunggal akhir ke kunci asing yang dipegangnya. +Obyek dapat dengan mudah menangani field multi nilai dengan menggunakan koleksi sebagai nilai field. Database relasional tidak memiliki fitur ini dan dibatasi hanya ke field nilai-tunggal. Ketika Anda memetakan asosiasi satu-ke-banyak, Anda bisa menangani ini menggunakan hubungan has many, intinya menggunakan kunci asing untuk nilai-tunggal akhir dari asosiasi. Tapi asosiasi banyak-ke-banyak tidak bisa melakukan ini karena tidak ada nilai-tunggal akhir ke kunci asing yang dipegangnya.

Jawabannya adalah resolusi klasik yang telah dipakai oleh orang selama dekade ini yakni: buat tabel ekstra (tabel asosiasi) untuk merekam asosiasi. @@ -747,9 +747,9 @@ Ide dasarnya adalah menggunakan tabel asosiasi untuk menyimpan asosiasi. Tabel i

Tabel asosiasi tidak mempunyai kaitan obyek dalam-memori dan kunci primernya adalah gabungan dari dua kunci primer dari tabel yang diasosiasikan. -Dalam batasan yang sederhana, tuntuk mengambil data dari tabel asosiasi, anda melakukan dua query (secara umum, ini juga bisa dicapai menggunakan satu query yang terdiri dari join). +Dalam batasan yang sederhana, tuntuk mengambil data dari tabel asosiasi, Anda melakukan dua query (secara umum, ini juga bisa dicapai menggunakan satu query yang terdiri dari join). Anggap pengambilan koleksi SkillRecord untuk daftar obyek PlayerRecord. -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. +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 (many-to-many), kita perlu mendefinisikan sebuah hubungan has many dalam kelas PlayerRecord dan sebagai tambahan mendefinisikan hubungan has many dalam kelas SkillRecord juga. @@ -883,10 +883,10 @@ PlayerSkillAssocation::finder()->deleteByPk(array('fk1','fk2'));

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. +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.
-

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. +

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 penyetel di mana metode pengambil akan mengambil hubungan secara kondisional. Contoh berikut menggambarkan bahwa PlayerRecord dapat mengambil obyek asing $skills secara kondisional.

class PlayerRecord extends BaseFkRecord @@ -970,7 +970,7 @@ class UserRecord extends TActiveRecord

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

Referensi

-- cgit v1.2.3