Pemeta Data

Pemeta Data memindahkan data antara obyek dan database sementara memeliharanya berdiri sendiri satu sama lain dan pemetanya sendiri. Jika Anda mulai dengan Active Records, mungkin nantinya Anda dihadapkan dengan obyek bisnis lebih kompleks seiring denga kemajuan proyek Anda. Ketika Anda membangun model obyek dengan banyak logika bisnis, sangat berharga untuk memakai mekanisme ini untuk mengatur data lebih baik dan perilaku bersamanya. Melakukan itu menyebabkan skema varian; yakni skema obyek dan skema relasional tidak sama.

Pemeta Data memisahkan obyek dalam-memori dari database. Tanggung jawabnya adalah mentransfer data diantara keduanya dan juga saling mengisolasinya. Dengan Pemeta Data obyek dalam-memori tidak perlu mengetahui meskipun ada sebuah database; tidak perlu kode antarmuka SQL, dan tentunya tidak mengetahui skema database. (Skema database selalu diabaikan dari obyek yang memakainya.)

Kapan Menggunakannya

Tujuan utama menggunakan Pemeta Data ialah ketika Anda menginginkan skema database dan model obyek tumbuh secara independen. Keuntungan utama dari Pemeta Data adalah bahwa saat bekerja pada obyek bisnis (atau domain) Anda bisa mengabaikan database, baik dalam desain maupun pembangunan propes pengujian. Obyek domain tidak mengetahui struktur databasenya karena semua ini dikerjakan oleh pemeta.

Ini membantu Anda dalam kode karena Anda bisa mengerti serta bekerja dengan obyek domain tanpa harus mengerti bagaimana ia disimpan dalam. Anda bisa memodifikasi model bisnis atau database tanpa harus mengubahnya. Dengan pemetaan rumit, terutama yang menyangkut database yang sudah ada, ini sangat berharga.

Harga tentunya merupakan lapisan ekstra yang tidak Anda peroleh dengan Rekaman Aktif, maka pengujian menggunakan pola ini adalah kompleksitas dari logika bisnis. Jika Anda memiliki logika bisa cukup sederhana, Rekaman Aktif mungkin akan mencukupi. Untuk logika yang lebih rumit, Pemeta Data mungkin lebih cocok.

Pemeta Data SqlMap

Kerangka kerja Pemeta Data SqlMap memudahkan untuk menggunakan database dengan aplikasi PHP. PemetaData SqlMap memasangkan obyek dengan prosedur tersimpan atau pernyataan SQL menggunakan deskriptor XML. Kesederhanaan adalah keuntungan terbesar dari PemetaData SqlMap di atas piranti pemetaan relasional obyek. Untuk menggunakan PemetaData SqlMap Anda bergantung pada obyek Anda sendiri, XML, dan SQL. Anda sedikit yang harus mempelajari yang belum Anda ketahui. Dengan Pemeta Data SqlMap Anda mempunyai tenaga penuh pada SQL dan prosedur tersimpan di tangan Anda.

alt="Tinjauan Pemeta Data SqlMap" id="fig:sqlmap.png" class="figure"/> Ini adalah penjelasan tingkat tinggi atas alur kerja yang dilukiskan pada gambar di atas. Menyediakan parameter, baik sebagai obyek ataupun tipe primitif. Parameter bisa dipakai untuk menyetel nilai runtime dalam pernyataan SQL atau prosedur. Jika nilai runtime tidak diperlukan, parameter dapat diabaikan.

Menjalankan pemetaan dengan mengirimkan parameter dan nama yang Anda berikan pada deskriptor XML Anda. Langkah ini adalah saat di mana keajaiban terjadi. Kerangka kerja akan menyiapkan pernyataan SQL atau prosedur tersimpan, menyetel setiap nilai runtime menggunakan parameter Anda, menjalankan prosedur atau pernyataan, dan mengembalikan hasil.

Dalam hal pemutakhiran, jumlah baris yang dipengaruhi dikembalikan. Dalam hal query, obyek tunggal, atau koleksi obyek dikembalikan. Seperti parameter, obyek hasil, atau koleksi obyek, bisa berupa obyek biasa ataupun tipe PHP primitif.

Menyiapkan koneksi database dan menginisialisasi SqlMap

Koneksi database untuk SqlMap dapat disetel seperti berikut. Lihat Menetapkan Koneksi Database untuk lebih jelasnya mengenai pembuatan koneksi database secara umum. //buat koneksi dan berikan ke manajer SqlMap. $dsn = 'pgsql:host=localhost;dbname=test'; //Postgres SQL $conn = new TDbConnection($dsn, 'dbuser','dbpass'); $manager = new TSqlMapManager($conn); $manager->configureXml('my-sqlmap.xml'); $sqlmap = $manager->getSqlMapGateway();

TSqlMapManager bertanggung jawab untuk menyiapkan koneksi database dan mengkonfigurasi SqlMap dengan file XML yang diberikan. metode configureXml() menerima string yang merujuk ke file konfigurasi XML SqlMap. Sekali dikonfigurasi, panggil metode getSqlMapGateway() untuk memperoleh turunan dari antarmuka gateway SqlMap (pakai obyek ini untuk menyisipkan/menghapus/mencari rekaman).

Koneksi database SqlMap juga bisa dikonfigurasi menggunakan tag <module> dalam application.xml atau config.xml seperti berikut.

Atribut ConfigFile harus menunjuk ke file konfigurasi SqlMap (dijelaskan nanti) baik menggunakan path absolut, path relatif ataupun path notasi titik namespace Prado (harus mengabaikan ekstensi ".xml").

Tip: Atribut EnableCache saat disetel "true" akan men-cache konfigurasi yang diurai. Anda harus membersihkan atau menghapus cache jika Anda mengubah file konfigurasinya. modul cache juga harus didefinisikan agar cache berfungsi.

Untuk mendapatkan antarmuka gateway SqlMap dari konfigurasi <module>, cukup lakukan misalnya class MyPage extends TPage { public function onLoad($param) { parent::onLoad($param); $sqlmap = $this->Application->Modules['my-sqlmap']->Client; $sqlmap->queryForObject(...); //query beberapa obyek } }

Contoh cepat

Mari kita anggap tabel "users" berikut yang berisi dua kolom bernama "username" dan "email", di mana "username" juga merupakan kunci primer. CREATE TABLE users ( username VARCHAR( 20 ) NOT NULL , email VARCHAR( 200 ) , PRIMARY KEY ( username ) );

Kemudian kita mendefinisikan kelas User biasa seperti berikut. Perhatikan bahwa User sangat sederhana. class User { public $username; public $email; }

Selanjutnya, kita perlu mendefinisikan file konfigurasi XML SqlMap, mari namai file sebagai my-sqlmap.xml.

Tag <select> mengembalikan definisi pernyataan SQL. Atribut id akan dipakai sebagai pengenal untuk query. Nilai atribut resultClass adalah nama kelas obyek yang dikembalikan. Sekarang kita dapat melakukan query obyek sebagai berikut: //anggap bahwa $sqlmap adalah turunan TSqlMapGateway $userList = $sqlmap->queryForList("SelectUsers"); //Atau hanya satu, jika hanya itu yang Anda butuhkan: $user = $sqlmap->queryForObject("SelectUsers");

Contoh di atas hanya menampilkan demonstrasi sedikit kemampuan Pemeta Data SqlMap. Rincian selanjutnya dapat ditemukan dalam SqlMap Manual.

Menggabung SqlMap dengan Rekaman Aktif

Contoh di atas nampaknya seperti sepele dan ia juga seperti banyak pekerjaan hanya untuk mengambil data. Akan tetapi, perhatikan bahwa kelas User sama sekali tidak mengetahui telah disimpan dalam database, dan database tidak mengetahui kelas User.

Salah satu keuntungan dari SqlMap adalah kemampuan memetakan hubungan obyek yang kompleks, koleksi dari datbase yang sudah ada. Dilain pihak, Rekaman Aktif menyediakan cara yang sangat sederhana untuk berinteraksi dengan database tapi tidak bisa melakukan hubungan atau koleksi yang lebih rumit. Kompromi yang baik adalah menggunakan SqlMap untuk mengambil hubungan dan koleksi rumit sebagai obyek Rekaman Aktif dan kemudian menggunakan Rekaman Aktif ini untuk memutakhirkan, menyisipkan dan menghapus.

Melanjutkan contoh sebelumnya, kita mengubah definisi kelas User menjadi sebuah Rekaman Aktif. class UserRecord extends TActiveRecord { const TABLE='users'; //nama tabel public $username; //kolom bernama "username" dalam tabel "users" public $email; /** * @return TActiveRecord active record finder instance */ public static function finder($className=__CLASS__) { return parent::finder($className); } }

Kita juga perlu mengubah definisi dari konfigurasi XML SqlMap XML configuration. Kita cukup perlu mengubah nilai atribut resultClass ke UserRecord.

Kode PHP untuk mengambil pengguna tetap sama, tapi sebaliknya SqlMap mengembalikan Rekaman Aktif, dan kita bisa mengambil keuntungan dari metode Rekaman Aktif. //anggap bahwa $sqlmap adalah turunan TSqlMapGateway $user = $sqlmap->queryForObject("SelectUsers"); $user->email = 'test@example.com'; //ubah data $user->save(); //simpan menggunakan Rekaman Aktif

Referensi