Salah satu solusi adalah menggunakan ORM (Object Relational Mapper) agar flexibel bila terjadi pindah database. pada ORM dapat menuliskan logic / bisnis proses kemudian ORM yang akan melakukan request ke database yang digunakan.
Salah satu ORM (Object Relational Mapper) yang ada di php dan disediakan pluginnya di symfony framework adalah DOCTRINE dgn Feature Doctrine Query Languange sebagai alternatif SQL.
Sebelum melanjutkan baca posting ini sebaiknya sudah mengerti lebih dahulu mengenai symfony framework (misalkan instalasi framework, membuat aplikasi, modul, dan plugin). kalau mau baca silakan dilanjut aja..
Oke langsung aja cara membuat nya:
Tahap 1.
Sebagai database sample untuk manipulasi data ORM Doctrine, database yg dibuat adalah symfBrige dengan tabel tunggal yaitu tbl_telepon, dibawah ini struktur tabelnya:
CREATE DATABASE symfBrige; USE symfBrige; CREATE TABLE `tbl_telepon` ( `kode` int(11) NOT NULL AUTO_INCREMENT, `nama` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `telepon` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `kelamin` enum('1','0') COLLATE utf8_unicode_ci DEFAULT '1', PRIMARY KEY (`kode`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Tahap 2
Download plugin ORM Doctrine di http://www.symfony-project.org/plugins/sfDoctrinePlugin
setelah di download ekstrak ke folder plugins smfony framework dan rename nama plugin nya menjadi seperti gambar dibawah ini:
Tahap 3
Lakukan clear cache symfony
php symfony cc
Tahap 4
Mengaktifkan plugin doctrine di config/ProjectConfiguration.class.php, lokasi nya seperti gambar di bawah ini
kemudian ketikan source code dibawah ini:
require_once dirname(__FILE__).'/../lib/symfony/autoload/sfCoreAutoload.class.php'; sfCoreAutoload::register(); class ProjectConfiguration extends sfProjectConfiguration { public function setup() { $this->enableAllPluginsExcept(array('sfPropelPlugin')); } }atau
require_once dirname(__FILE__).'/../lib/symfony/autoload/sfCoreAutoload.class.php'; sfCoreAutoload::register(); class ProjectConfiguration extends sfProjectConfiguration { public function setup() { $this->enablePlugins(array('sfDoctrinePlugin')); } }
Tahap 5
Membuat koneksi database di file config/databases.yml lokasi nya seperti gambar dibawah ini:
kemudian tuliskan configuration conection databases dibawah ini:
all: doctrine: class: sfDoctrineDatabase param: #classname: DebugPDO dsn: mysql:dbname=symfBrige;host=127.0.0.1 username: root password: pass encoding: utf8 persistent: true pooling: true
untuk nama database, username, password, host dapat disesuikan dengan yang dibutuhkan
Tahap 6
Buat aplikasi dengan nama frontend (bila sudah ada tidak perlu dibuat)
php symfony generate:app frontendkemudian buat sebuah modul doctrieTest di aplikasi frontend
php symfony generate:module frontend doctrieTestbila proses membuat aplikasi dan modul berhasil maka struktur file nya menjadi seperti dibawah ini:
Tahap 7
Lakukan clear cache symfony
php symfony cc
Tahap 8
Membuat schema dari database yang gunakan. ketikan task symfony di bawah ini:
symfony doctrine:build-schema frontendTulisan frontend adalah nama aplikasi. Bila building schema berhasil maka akan terbentuk sebuah file bernama schema.yml, lokasinya seperti gambar dibawah ini:
Tahap 9
Membuat model class php berdasarkan schema.yml yang telah dibuat, ketikan task symfony dibawah ini:
symfony doctrine:build-model frontend
Tulisan frontend adalah nama aplikasi. bila proses build-model berhasil maka akan terbentuk model class seperti gambar dibawah ini:
class model yang terbentuk adalah nama file yang berawalan TblTelepon.
Tahap 10
Lakukan clear cache symfony
php symfony cc
Tahap 11
Pada actions module doctrieTest aplikasi frontend , lokasi nya seperti gambar dibawah ini:
dapat di tulisakan sintak-sintak untuk Doctrine Query Languange (DQL) atau Native SQL seperti contoh dibawah ini:
DQL Untuk mengambil semua data dari tabel tbl_telepon
$q = Doctrine_Query::create() ->select('t.*') ->from('TblTelepon t'); $data = $q->fetchArray(); print_r($data); exit;
Untuk mengambil semua data dari tabel tbl_telepon secara native SQL menggunakan conection Doctrine
$con = Doctrine_Manager::connection(); $query = "select * from tbl_telepon"; $data = $con->fetchAssoc($query); print_r($data); exit;
Untuk update data secara native SQL menggunakan conection Doctrine
$con = Doctrine_Manager::connection(); $query = "update tbl_telepon set nama='DENDIE SANJAYA' where kode='1'"; $data = $con->execute($query); exit;
Memanggil store procedure secara native SQL menggunakan conection Doctrine
$con = Doctrine_Manager::connection(); $query = "call sp_telepon"; $data = $con->fetchAssoc($query); print_r($data); exit;
Tahap 12 (Optional)
Tahap ini disebut optional karna bisa ada atau tidak, tahap ini adalah untuk melakukan override class dari model class yang telah dibuat, override berguna untuk menambahkan fungsionalitas dari class tersebut tanpa perlu "menyentuh" super class model tersebut.
sebagai contoh pada model class TblTelepon (yg telah dibuat diatas tadi) akan di tambahkan sebuah metod/function untuk pencarian nomor telepon. cara membuat nya dibawah ini, edit file TblTelepon.class.php lokasinya ada pada gambar dibawah ini:
pada file tersebut tambahkan kode program :
class TblTelepon extends BaseTblTelepon { static public function findNomor($nama) { $con = Doctrine_Manager::connection(); $query = "select telepon from tbl_telepon where nama='$nama'"; $data = $con->fetchAssoc($query); return $data; } }Dan pada actions module doctrieTest aplikasi frontend, untuk mencari nomor telepon cukup dengan memanggil metod findNomor
$data = TblTelepon::findNomor('dendie sanjaya'); print_r($data); exit;class yang telah di override (TblTelepon.class.php) diatas tidak akan tertimpa/overwrite bila dilakukan task symfony build-model ulang.
Sumber referensi yang bisa dibaca:
- http://www.symfony-project.org/doctrine/1_2/en/01-Getting-Started
manual doctrine dari symfony framwork - http://www.doctrine-project.org/documentation/manual/1_0/en
manual doctrine
mas dendie....
ReplyDeletesetelah saya run -> php symfony doctrine:build-schema frontend tampil message error "there is no open connection"
Kesalahan dimana? Trims
Mungkin terjadi kesalahan format (seperti tidak boleh menggunan tab) atau strukutr YAML dalam menuliskan format YAML di file database.yml.
ReplyDeleteCheckidot gan.. mungkin membantu ->
http://oldforum.symfony-project.org/index.php/m/66514/