From fc0db15ebce101602fb1cbfa8f6a5cc0f8b58be4 Mon Sep 17 00:00:00 2001
From: Fabio Bas The class diagram for TActiveButton is illustrated in the figure below.
-Most active control that can perform callback request have a similar structure.
- TActiveButton is an extension of TButton
-and implements two additional interfaces ICallbackEventHandler and
-IActiveControl. The TActiveButton contains an instance of
-TBaseActiveCallbackControl
-available through the ActiveControl property of TActiveButton.
-The following example set the callback parameter of the TActiveButton when
-a callback request is dispatched.
- In the OnCallback event handler method, the CallbackParameter
-is available in the $param object. With in the ActiveControl property is an instance of
-TCallbackClientSide available
-as a property ClientSide of TActiveButton.
-The ClientSide property contains sub-properties, such as RequestTimeOut,
-and client-side javascript event handler, such as OnLoading,
-that are used by the client-side when making a callback request.
-The following example demonstrates the toggling of a "loading" indicator
-when the client-side is making a callback request.
- The example loads the "effects" javascript library using the
-TClientScript component.
-The ClientSide.OnLoading property value contains
-javascript statement that uses the "effects" library to show the "Loading..."
-span tag. Similarly, ClientSide.OnComplete property
-value contains the javascript statement that hides the "Loading..." span tag.
-See TCallbackClientSide for
-further details on client-side property details.
- See the Introduction
+
+Active controls extends standard PRADO controls adding the ability to automatically update themselves on callbacks without the need of ad-hoc javascript calls. See the Introduction
for a quick overview of the concept behind active controls (AJAX enabled controls).
Most active controls have a property of
ActiveControl and
@@ -373,92 +374,4 @@ if Javascript was disabled on the client's browser. The following classes provide the basic infrastructure classes required to
-realize the active controls. They can be useful to develop new active controls, but Prado users tipically don't need
-to use them.
- TActiveControlAdapter customizes the parent TControl class for active control classes.
- It tracks changes in the viewstate values of the control and update
- differences of the client-side HTML element attributes.
-
- TActiveListControlAdapter allows the adapted list controls to change the selections
- on the client-side during a callback request.
-
- TActivePageAdapter process the page life-cycle for callback requests.
-
- TBaseActiveControl class provided additional basic properties common for every
- active control. An instance of TBaseActiveControl or its decendent
- TBaseActiveCallbackControl is created by TActiveControlAdapter::getBaseActiveControl()
- method.
- The EnableUpdate property determines wether the active
- control is allowed to update the contents of the client-side when the callback
- response returns.
-
- TCallbackResponseAdapter alters the THttpResponse's outputs.
- A TCallbackResponseWriter is used instead of the TTextWrite when
- createHtmlWriter is called. Each call to createHtmlWriter will create
- a new TCallbackResponseWriter. When flushContent() is called each
- instance of TCallbackResponseWriter's content is flushed.
- The callback response data can be set using the ResponseData property.
- The following classes provide advanced properties and events needed to realize the active controls.
-A Prado user can use them to customize active controls behaviour and interact directly with the client side during a callback.
-
+A classic webpage can only transfer data back to the server using an http postback request that requires a full page reload. This is a problem for web applications, since a synchronous page reload breaks the user interaction: the user must wait for the response to arrive and the page will lose its current status (the scrolling position, the currently focused control, etc..).
+
+A common solution to this problem is the use of AJAX (Asynchronous JavaScript and XML) callbacks. After the first full page load, the web application can make subsequents requests using javascript. The callback requests are asynchronous, so the user can continue to interact with the page while the response is loading. The response contains a list of changes that will be applied to the page "on the fly", like replacing existing elements with new content or add some css style to an existing element.
+
+PRADO has builtin support for AJAX callbacks in the form of Active Controls. These controls can trigger a callback request and have their properties (value, css style, attributes, ..) updated during a callback.
+Before digging inside the list of Active Controls, it's good to have a look to how a page can be aware if the current request is a callback and how to interact with the page rendered on the client browser.
+
+Active controls extends standard PRADO controls adding the ability to automatically update themselves on callbacks without the need of ad-hoc javascript calls. Active controls are reliant on a collection of javascript classes that gets added to the page automatically when needed.
+
+Most active controls have a ActiveControl.EnableUpdate property that determines whether the active control is allowed to update the contents of the client-side when the callback response returns. Depending on the control different properties can be updated.
+
+Some active controls can trigger a callback as a consequence of a clientside event (a button click, a checkbox being checked, a DOM event). The callback will first raise the normal serverside event associated to the control (eg: OnClick for a TButton or OnSelectedIndexChanged for a TRadioButtonList) and then the OnCallBack event.
+The AutoPostBack property typically defaults to true for these controls.
+
+Active controls have a ClientSide property that provides many subproperties to customize the controls and to hook some javascript code to the callback lifecycle, like showing a "Loading" logo at the start of a callback and hide it at the end.
+ The class diagram for TActiveButton is illustrated in the figure below.
+Most active control that can perform callback request have a similar structure.
+ TActiveButton is an extension of TButton
+and implements two additional interfaces ICallbackEventHandler and
+IActiveControl. The TActiveButton contains an instance of
+TBaseActiveCallbackControl
+available through the ActiveControl property of TActiveButton.
+The following example set the callback parameter of the TActiveButton when
+a callback request is dispatched.
+ In the OnCallback event handler method, the CallbackParameter
+is available in the $param object. With in the ActiveControl property is an instance of
+TCallbackClientSide available
+as a property ClientSide of TActiveButton.
+The ClientSide property contains sub-properties, such as RequestTimeOut,
+and client-side javascript event handler, such as OnLoading,
+that are used by the client-side when making a callback request.
+The following example demonstrates the toggling of a "loading" indicator
+when the client-side is making a callback request.
+ The example loads the "effects" javascript library using the
+TClientScript component.
+The ClientSide.OnLoading property value contains
+javascript statement that uses the "effects" library to show the "Loading..."
+span tag. Similarly, ClientSide.OnComplete property
+value contains the javascript statement that hides the "Loading..." span tag.
+See TCallbackClientSide for
+further details on client-side property details.
+ The following classes provide the basic infrastructure classes required to
+realize the active controls. They can be useful to develop new active controls, but Prado users tipically don't need
+to use them.
+ TActiveControlAdapter customizes the parent TControl class for active control classes.
+ It tracks changes in the viewstate values of the control and update
+ differences of the client-side HTML element attributes.
+
+ TActiveListControlAdapter allows the adapted list controls to change the selections
+ on the client-side during a callback request.
+
+ TActivePageAdapter process the page life-cycle for callback requests.
+
+ TBaseActiveControl class provided additional basic properties common for every
+ active control. An instance of TBaseActiveControl or its decendent
+ TBaseActiveCallbackControl is created by TActiveControlAdapter::getBaseActiveControl()
+ method.
+ The EnableUpdate property determines wether the active
+ control is allowed to update the contents of the client-side when the callback
+ response returns.
+
+ TCallbackResponseAdapter alters the THttpResponse's outputs.
+ A TCallbackResponseWriter is used instead of the TTextWrite when
+ createHtmlWriter is called. Each call to createHtmlWriter will create
+ a new TCallbackResponseWriter. When flushContent() is called each
+ instance of TCallbackResponseWriter's content is flushed.
+ The callback response data can be set using the ResponseData property.
+ The following classes provide advanced properties and events needed to realize the active controls.
+A Prado user can use them to customize active controls behaviour and interact directly with the client side during a callback.
+
-Composition is the easiest way of creating new controls. It mainly involves instantiating existing controls, configuring them and making them the constituent components. The properties of the constituent components are exposed through subproperties.
+Composition is the easiest way of creating new controls. It mainly involves instantiating existing controls, configuring them and making them the constituent components. The properties of the constituent components are exposed through subproperties.
One can compose a new control in two ways. One is to extend TCompositeControl and override the TControl::createChildControls() method. The other is to extend TTemplateControl (or its child classes) and write a control template. The latter is easier to use and can organize the layout constituent components more intuitively, while the former is more efficient because it does not require parsing of the template.
diff --git a/demos/quickstart/protected/pages/Controls/id/NewControl.page b/demos/quickstart/protected/pages/Controls/id/NewControl.page
index ea083f6c..85c6eff0 100755
--- a/demos/quickstart/protected/pages/Controls/id/NewControl.page
+++ b/demos/quickstart/protected/pages/Controls/id/NewControl.page
@@ -10,7 +10,7 @@ Secara umum, ada dua cara penulisan kontrol baru: komposisi kontrol yang sudah a
-Komposisi adalah cara termudah membuat kontrol baru. Ia melibatkan terutama penurunan kontrol yang sudah ada, mengkonfigurasinya dan menjadikannya unsur komponen. Properti dari unsur komponen diperlihatkan melalui subproperti.
+Komposisi adalah cara termudah membuat kontrol baru. Ia melibatkan terutama penurunan kontrol yang sudah ada, mengkonfigurasinya dan menjadikannya unsur komponen. Properti dari unsur komponen diperlihatkan melalui subproperti.
Seseorang dapat menciptakan sebuah kontrol baru dalam dua cara. Pertama adalah memperluas TCompositeControl dan mengganti metode TControl::createChildControls(). Kedua adalah memperluas TTemplateControl (atau kelas anaknya) dan menulis template kontrol. Yang terakhir lebih mudah digunakan dan bisa mengatur tata letak unsur komponen lebih intuitif, sementara pembentuk lebih efisien karena ia tidak perlu menguraikan template.
diff --git a/demos/quickstart/protected/pages/Database/ActiveRecord.page b/demos/quickstart/protected/pages/Database/ActiveRecord.page
index 537c65e0..cf1485bd 100755
--- a/demos/quickstart/protected/pages/Database/ActiveRecord.page
+++ b/demos/quickstart/protected/pages/Database/ActiveRecord.page
@@ -129,7 +129,7 @@ You may specify qualified table names. E.g. for MySQL, TABLE = "`database1`.
More details regarding TComponent can be found in the Components documentation.
+ More details regarding TComponent can be found in the Components documentation.
Later we shall use the getter/setters to allow for lazy loading of relationship objects.
We first need to change the $skills=array() declaration to a private property
$_skills (notice the underscore) and set it to null instead. This allows us
to define the skills property using getter/setter methods
-(see Components for details). The getSkills()
+(see Components for details). The getSkills()
getter method for the skills property will lazy load the corresponding skills foreign record
when it is used as follows. Notice that we only do a lazy load when its $player_id is
not null (that is, when the record is already fetched from the database or player id was already set).
diff --git a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page b/demos/quickstart/protected/pages/Database/id/ActiveRecord.page
index 454aa3f9..8e81678e 100755
--- a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page
+++ b/demos/quickstart/protected/pages/Database/id/ActiveRecord.page
@@ -3,7 +3,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
+ Dasar dari Rekaman Aktif adalah kelas bisnis, sebagai contoh, kelas
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. Rekaman Aktif adalah pilihan yang baik untuk logika domain yang tidak terlalu rumit,
+ Rekaman Aktif adalah pilihan yang baik untuk logika domain yang tidak terlalu rumit,
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.
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.
+
+ 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.
+ Pemeta Data SqlMap.
+ Pemeta Data SqlMap bisa dipakai untuk mengambil obyek Rekaman Aktif, hasilnya; obyek Rekaman Aktif ini bisa dipakai untuk memutakhirkan database.
"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 berfungsi untuk melakukan tugas-tugas berikut.
-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,
+"Anda pikir kustomer sebagai obyek, di mana hanya satu,
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.
+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.
Dan jika dua orang memutakhirkan kustomer pada dua duplikat obyek, siapapun yang memutakhirkan pertama kali, atau mungkin yang terakhir yang menang." [A. Hejlsberg 2003]
-Implementasi Rekaman Aktif memanfaatkan kelas Prado DAO untuk akses data.
-Implementasi Rekaman Aktif saat ini mendukung database sebagai berikut.
+Implementasi Rekaman Aktif memanfaatkan kelas Prado DAO untuk akses data.
+Implementasi Rekaman Aktif saat ini mendukung database sebagai berikut.
Mari kita anggap tabel
- "users" berikut yang berisi dua kolom bernama "username" dan "email",
- di mana "username" juga merupakan kunci primer.
+ "users" berikut yang berisi dua kolom bernama "username" dan "email",
+ di mana "username" juga merupakan kunci primer.
Lebih jelas mengenai TComponent dapat ditemukan dalam Dokumentasi komponen.
+ Lebih jelas mengenai TComponent dapat ditemukan dalam Dokumentasi komponen.
Nantinya kita harus dapat menggunakan pengambil/penyetel guna membolehkan pengambilan malas atas obyek yang berhubungan.
- Metode statis finder() mengembalilkan turunan UserRecord
+ Metode statis finder() mengembalilkan turunan UserRecord
yang dapat dipakai untuk mengambil rekaman dari database. Pengambilan rekaman menggunakan metode finder akan didiskusikan nanti. Metode statis TActiveRecord::finder() mengambil nama kelas Rekaman Aktif sebagai parameter.
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).
@@ -178,13 +178,13 @@ class MyDb2Record extends TActiveRecord
return $conn;
}
}
-
+
- Koneksi database standar dapat juga dikonfigurasi menggunakan tag <module> dalam application.xml
+ Koneksi database standar dapat juga dikonfigurasi menggunakan tag <module> dalam application.xml
atau config.xml seperti berikut.
Mencari rekaman menggunakan SQL penuh di mana findBySql() mengembalikan Rekaman Aktif dan findAllBySql()mengembalikan array obyek rekaman.
Untuk setiap kolom yang dikembalikan, kelas Rekaman Aktif terkait harus mendefinisikan variabel atau properti untuk setiap nama kolom terkait.
@@ -371,7 +371,7 @@ Obyek dimutakhirkan dengan kunci primer dari tabel itu yang berisi definisi yang
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().
+Untuk memutakhirkan rekaman dalam database, cukup ubah satu atau lebih properti obyek Rekaman Aktif yang sudah diambil dari database dan kemudian panggil metode save().
Untuk menghapus rekaman yang sudah ada dan diambil, cukup panggil metode delete().
- Anda juga dapat menghapus rekaman dalam database dengan kunci primer tanpa mengambil rekaman apapun menggunakan metode deleteByPk() (dan metode yang sama deleteAllByPks()).
+ Anda juga dapat menghapus rekaman dalam database dengan kunci primer tanpa mengambil rekaman apapun menggunakan metode deleteByPk() (dan metode yang sama deleteAllByPks()).
Sebagai contoh, untuk menghapus satu atau beberapa rekaman dengan menggunakan satu atau lebih kunci primer.
-Event OnExecuteCommand dimunculkan ketika perintah dijalankan dan hasil dari database dikembalikan. Obyek parameter TDataGatewayResultEventParameter
-dari properti Result berisi data yang dikembalikan dari database.
+Event OnExecuteCommand dimunculkan ketika perintah dijalankan dan hasil dari database dikembalikan. Obyek parameter TDataGatewayResultEventParameter
+dari properti Result berisi data yang dikembalikan dari database.
Data yang dikembalikan dapat diubah dengan setelan properti Result.
Tujuannya adalah untuk mendapatkan model obyek yang mewakili ke beberapa derajat hubungan entitas dalam gambar di atas.
+ Tujuannya adalah untuk mendapatkan model obyek yang mewakili ke beberapa derajat hubungan entitas dalam gambar di atas.
Hubungan entitas antara tabel Teams dan Players adalah apa yang dikenal sebagai hubungan 1-M. Yaitu, satu Tim dapat berisi 0 atau lebih Pemain. Dalam batasan hubungan obyek, kita katakan bahwa obyek TeamRecord memiliki banyak obyek PlayerRecord.
+ Hubungan entitas antara tabel Teams dan Players adalah apa yang dikenal sebagai hubungan 1-M. Yaitu, satu Tim dapat berisi 0 atau lebih Pemain. Dalam batasan hubungan obyek, kita katakan bahwa obyek TeamRecord memiliki banyak obyek PlayerRecord.
(Perhatikan kebalikan dari arah hubungan antara tabel dan obyek.)
@@ -548,7 +548,7 @@ class TeamRecord extends TActiveRecord
const TABLE='Teams';
public $name;
public $location;
-
+
public $players=array(); // deklarasi ini tidak diperlukan lagi sejak v3.1.2
//mendefinisikan anggota $player yang memiliki hubungan banyak dengan PlayerRecord
@@ -616,7 +616,7 @@ Metode with_xxx() (di mana xxx adalah nama properti hubungan,
-Properti $RELATIONS dari PlayerRecord mendefinisikan properti $team milik TeamRecord.
-Array $RELATIONS juga mendefinisikan dua hubungan lainnya yang nanti akan kita uji dalam seksi di bawah ini.
-Dalam array(self::BELONGS_TO, 'TeamRecord'), elemen pertama mendefinisikan tipe hubungan, dalam hal ini self::BELONGS_TO dan
+Properti $RELATIONS dari PlayerRecord mendefinisikan properti $team milik TeamRecord.
+Array $RELATIONS juga mendefinisikan dua hubungan lainnya yang nanti akan kita uji dalam seksi di bawah ini.
+Dalam array(self::BELONGS_TO, 'TeamRecord'), elemen pertama mendefinisikan tipe hubungan, dalam hal ini self::BELONGS_TO dan
elemen kedua adalah string 'TeamRecord' yang terkait ke nama kelas dari kelas TeamRecord.
Obyek pemain dengan obyek tim terkait dapat diambil serperti berikut.
Intinya, ada hubungan "belongs to" untuk obyek yang mengaitkan entitas yang memmpunyai kolom yakni kunci asing. Dalam keadaan tertentu, kita melihat bahwa tabel Profiles mempunyai batasan kunci asing pada kolom player_id yang terkait ke tabel
Players kolom player_id. Selanjutnya, obyek ProfileRecord
memiliki properti ($player) yang adalah milik obyek PlayerRecord.
-Demikian juga, tabel Players mempunyai batasan kunci asing pada kolom team_name yang terkait ke tabel Teams kolom name.
+Demikian juga, tabel Players mempunyai batasan kunci asing pada kolom team_name yang terkait ke tabel Teams kolom name.
Kemudian, obyek PlayerRecord mempunyai properti ($team) yang adalah milik obyek TeamRecord.
@@ -27,7 +26,7 @@
TActiveButton Class Diagram
-Adding Client Side Behaviour
-
-Active Controls (AJAX enabled Controls)
-Active Control Basic Infrastructure Classes
-
-
-
-TActiveControlAdapter
- TActiveListControlAdapter
- TActivePageAdapter
- TBaseActiveControl
- TCallbackResponseAdapter
- Active Control Infrastructure Advanced Classes
-
-
-
Overview of Active Controls
-
-TODO:
+AJAX: Introduction
+Interacting with a page on callback
+
+
+The IsCallBack property of the TPage class exposes whether the current request being handled is the consequence of a callback, and the CallbackClient property provides many methods to update and alter the client-side content during a callback request.
+Active Controls (AJAX enabled Controls)
+TActiveButton Class Diagram
+Adding Client Side Behaviour
+
+Active Control Basic Infrastructure Classes
+
+
+
+TActiveControlAdapter
+ TActiveListControlAdapter
+ TActivePageAdapter
+ TBaseActiveControl
+ TCallbackResponseAdapter
+ Active Control Infrastructure Advanced Classes
+
+
Composition of Existing Controls
Komposisi Kontrol yang Sudah Ada
Kapan Menggunakannya
-Implikasi Desain
Database yang Didukung
Mendefinisikan Rekaman Aktif
Menggunakan application.xml di dalam Kerangka Kerja Prado
findBySql() dan findAllBySql()
Menghapus rekaman yang sudah ada
Hubungan Rekaman Aktif
Pemetaan Kunci Asing
-
-Jawabannya adalah resolusi klasik yang telah dipakai oleh orang selama dekade ini yakni: buat tabel ekstra (tabel asosiasi) untuk merekam asosiasi. +Jawabannya adalah resolusi klasik yang telah dipakai oleh orang selama dekade ini yakni: buat tabel ekstra (tabel asosiasi) untuk merekam asosiasi. Ide dasarnya adalah menggunakan tabel asosiasi untuk menyimpan asosiasi. Tabel ini memiliki ID kunci asing untuk dua tabel yang dikaitkan bersama, masing-masing memiliki pasangan dari obyek yang diasosiasikan.
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). -Anggap pengambilan koleksi SkillRecord untuk daftar obyek PlayerRecord. +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.
@@ -794,7 +794,7 @@ class SkillRecord extends TActiveRecordProperti statis $RELATIONS dari SkillRecord mendefinisikan bahwa properti $players memiliki banyak PlayerRecords melalui tabel asosiasi 'Player_Skills'. 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. +elemen kedua adalah string 'PlayerRecord' yang terkait ke nama kelas dari kelas PlayerRecord, dan elemen ketiga adalah nama dari nama tabel asosiasi.
Untuk tabel asosiasi yang mererefensi dirinya sendiri, yaitu titik asosiasi ke tabel yang sama. Sebagai contoh, anggap tabel items dengan item terkait M-N melalui tabel asosiasi related_items. Sintaks dalam contoh berikut adalah benar untuk database PostgreSQL. Untuk database lain, lihat dokumentasinya masing-masing untuk mendefinisikan batasan kunci asing.
Nama tabel asosiasi dalam elemen ketiga dari array hubungan dapat berisi nama kolom tabel asing. Kolom yang didefinisikan dalam tabel asosiasi harus juga didefinisikan dalam kelas rekaman (contohnya properti $related_item_id terkait ke kolom related_item_id dalam tabel related_items). +
Nama tabel asosiasi dalam elemen ketiga dari array hubungan dapat berisi nama kolom tabel asing. Kolom yang didefinisikan dalam tabel asosiasi harus juga didefinisikan dalam kelas rekaman (contohnya properti $related_item_id terkait ke kolom related_item_id dalam tabel related_items).