Datamapper ORM for CodeIgniter

Lama gak share tentang programming

Logo CodeIgniter

Bikin aplikasi web itu gak gampang loh. A-pli-ka-si!! Bukan sekedar web portfolio yang bisa pake static html, atau blog yang bisa pake wordpress, atau portal informasi yang bisa pake joomla. Tapi karena merepotkan kalau mulai dari nol, saya pakai CodeIgniter PHP Framework biar cepet dan kodenya enak dibaca.

Saya masih belajar CI ini. Waktu cari-cari library tambahan, dulu saya nemu tutorial di blognya Burak tentang pemakaian Doctrine ORM. ORM adalah Object Relational Mapping, yaitu salah satu metode pemrograman yang memetakan tabel database dengan class/object. Jadi 1 class tersebut merepresentasikan 1 tabel di database.

Pakai Doctrine dengan CI lumayan ribet. Konfigurasinya lumayan rumit, apalagi susah kalau mau ditambahin Modular Extension. Ada klien saya juga yang lapor kalau waktu generate report kok sampe memory exceeded. Wah, gawat ini. Memang sih awalnya Doctrine dibuat bukan untuk CI, tapi untuk Symfony Framework.

Sempat beberapa waktu saya memutuskan gak pake ORM, tapi pake Model dari CI seperti biasa. Tapi agak nggak enak karena mesti nulis query-query lagi. Paling pol ya pakai Active Record-nya.

Setelah cari-cari referensi lagi, saya nemu library ORM yang cukup asik. Namanya cukup simple, yaitu Datamapper ORM. Saya langsung ambil update terbaru dari repositorynya, terus langsung install fresh CI 2.0. Baca-baca sedikit dokumentasinya, manteb deh. Saya akhirnya putuskan pakai ini aja buat project saya nantinya.

Kelebihannya dibandingkan pakai Doctrine ORM, jelas yang ini lebih ringan dan nggak ribet karena masih pakai library CI yang lain. Active Record dan Database Library asli CI masih dipakai sama library ini. Selain itu, nggak perlu mendefinisikan seluruh field di class ORM-nya, program sudah otomatis fetch field yang ada. Ditambah lagi, dia langsung integrasi dengan Form Validation library, sehingga memudahkan proses validasi input record.

Kalau kelemahannya, jelas ORM ini gak bisa dipakai secara mandiri tanpa CI. Kalau Doctrine kan bisa meski gak pakai Symfony. Fungsi-fungsi dan tool pembantu mungkin nggak selengkap Doctrine, tapi cukuplah untuk sekedar aplikasi kecil.

Contoh pemakaiannya nih, misal ada tabel users (dengan “s”), dengan field username dan password. Contoh ORM class-nya:

class User extends Datamapper {
  // untuk validasi
  $validation = array(
    'username' => array(
      'rules' => array('required', 'trim', 'min_length' => 4, 'max_length' => 20, 'unique', 'alpha_dash')
    ),
    // encrypt adalah fungsi tambahan
    'password' => array(
      'rules' => array('required', 'trim', 'min_length' => 4, 'encrypt')
    ),
    // field tambahan yang tidak ada di tabel, harus sama dengan field password
    'confirm_password' => array(
      'rules' => array('required', 'trim', 'encrypt', 'matches' => 'password')
    )
  );
  
  function _encrypt($field) {
    if (!empty($this->{$field})) {
      $this->{$field} = sha1($this->{$field});
    }
  }
}

Terus tinggal bikin gini di controller:

$user = new User();
$user->username = $username; // $username bisa dari post data
$user->password = $password;
// validasi
$user->validate();
// simpan jika valid
if($user->valid) {
  $user->save();
}

Yak, beres. Gak perlu panjang-panjang bikin method untuk validasi, gak perlu repot-repot panggil method encrypt tiap mau save password, selesai deh. Ditambah lagi, kalau ada field khusus untuk menyimpan informasi waktu created dan updated, otomatis akan diupdate oleh Datamapper.

Sekarang ini lagi nyoba gimana ini bisa berjalan dengan baik kalau dikombinasikan sama HMVC. Semoga aja lancar. Amiin. Selamat mencoba! 🙂

16 Comments

  1. mas, klo kita pake No-SQL khususx odbms gak perlu make ORM…
    keuntungan pake Teknologi NO-SQL(ODBMS) kita bisa mendevelop software dengan menggunakan konsep OOSE murni tanpa mapping2an sql to object…

    Reply
    • hm.. iya juga sih.. masalahnya ini kan masih pakai MySQL, karena ikutan shared host. kalau ntar udah punya server sendiri, saya jelas lebih milih No-SQL lah, paling nggak mongoDB. cuma tergantung kasus juga, karena No-SQL sepertinya kurang cocok untuk transaction..

      udah pakai ODBMS emang? pakai CI juga?

      Reply
  2. Mas Bro, kalo mau bikin model relationship tapi field2 nya gak sesuai sama rulesnya datamapper gimana mas? kyk nama foreign_key dan primary_key nya bisa di atur sendiri gak?

    Reply
  3. Mas kalo mau buat error message untuk custom validation di datamapper gimana yah ?

    saya coba seperti ini di modelnya :
    var $validation = array(
    ‘jumlah’ => array(
    ‘rules’ => array(‘required’, ‘cek_jumlah’)
    ),
    );

    function _cek_jumlah($field)
    {
    if($this->{$field} <= 75)
    return TRUE;
    else
    {
    return FALSE;
    }
    }

    Nah yang saya bingung sebelum return false di fungsi cek jumlah itu diisi apa biar kita bisa nampilin pesan error buatan kita sendiri. masalahnya di user guidenya gak ada.

    Mohon bantuannya.

    Reply
  4. mas mau tanya,
    apa penggunaan ORM mempengaruhi performa eksekusi query (mempercepat proses retrieval data, penggunaan join, dll)? atau hanya mempermudah proses developing saja?
    terimakasih

    Reply

Leave a Comment.