Belajar Doctrine Query Language (DQL)


tes
Query with your passion!

Sama seperti SQL, DQL (deqil) tidak lah rumit. Operasi dasar nya mirip dengan SQL yang select, update, insert, dan delete. Untuk info lebih lengkap, bisa Anda nikmati langsung di web doctrine. Baca juga berbagai referensi di website symfony.

Sebelumnya membaca lebih lanjut, disarankan Anda sudah pernah tahu (memahami) penggunaan SQL pada MySQL atau Oracle. Baca juga artikel sebelumnya, yang menjelaskan konfigurasi dan konsep penggunaan Doctrine.

Untuk melakukan Query dengan Doctrine tidak lah sulit, karena pola pendeklarasiannya memang dibuat semirip mungkin dengan SQL, bahkan lebih praktis. Penulisan Query, sebaiknya dilakukan pada layer Controller, atau dalam symfony kita biasa lakukan di action class. Hasil Query tersebut baru disajikan sesuai kebutuhan pada tampilan web (template).

Query Select Sederhana?

Berikuti ini saya akan berikan contoh Query dalam SQL untuk select sederhana,

$data_user = "SELECT * FROM  user";

artinya untuk mengambil semua field data pada table user. Dalam Query Doctrine kita bisa menuliskan seperti berikut ini,

$this->data_user = Doctrine::getTable('User')->findAll();

Perhatikan susunan penulisannya. Ada getTable dan element yang mau dicari adalah semua, findAll. Perubahan mendasar dalam penulisan script SQL adalah menggunakan method dengan penamaan yang lebih “manusiawi”. Kalau di SQL biasa dengan tanda bintang asterik “*“, kalau di Doctrine menggunakan method findAll(). Kalau di SQL memanggil nama table nya (misal. user), kalau di Doctrine memanggil nama Model nya (misal. User). Dalam Doctrine (symfony), penulisan nama Model selalu di awali huruf besar, jadi agak sedikit berbeda dengan nama table di database nya.

  • Perhatikan susunan penulisannya, karena kita akan sering menemui hal-hal seperti itu nantinya..

oks, gimana? gampang kan… 🙂

Query Select untuk Primary Key tertentu

Percobaan selanjutnya kita akan menggunakan Query select sederhana untuk mengambil data dengan Primary Key tertentu. Misal Table user memiliki primary key pada field id, dan kita akan menampilkan data yang id nya ‘1’. maka SQL nya adalah seperti berikut ini,

$data_user = "SELECT * FROM user WHERE (id = '1')";

Maka dalam Query Doctrine kita dapat menuliskan seperti ini,

$this->data_user = Doctrine::getTable('User')->find(1);

Method find() dalam Doctrine digunakan untuk menemukan record berdasarkan primary key nya. Dalam kasus ini, kita tidak perlu memberi tahu Doctrine “siapa yang menjadi primary key“. Pokok nya kalau kita gunakan method find(), maka pasti akan mencari untuk primary key nya saja, yaitu field id.

gimana? makin gampang kan… 🙂

Query Select mencari field tertentu

Dan ini yang lebih menarik lagi. Yaitu jika kita ingin mencari data dengan syarat field tertentu. Misal, saya ingin mencari record yang field ‘name’ pada table tersebut berisi ‘sule’. Dalam SQL kita biasa menuliskan seperti ini,

$data_user = "SELECT * FROM user u WHERE (u.name = 'sule')";

pada contoh diatas kita menggunakan alias ‘u‘ untuk table user, dan kemudian menambahkan syarat bahwa field name harus terisi oleh ‘sule‘. Dalam Doctrine, penulisannya semakin mudah.

$this->data_user = Doctrine::getTable('User')->findByName('sule');

Gunakan method findBy… yg penulisannya ditambahkan dengan nama field yang akan kita cari. Dalam contoh diatas field yang akan dicari ada lah field ‘name‘, maka method yang digunakan findByName(). Perhatikan penulisan huruf besar kecil, sebagai penanda kata.

ampiuun pak, kok makin gampang..

Query Select dengan beragam Syarat

Tingkatan lebih lanjut, kita akan mencoba melakukan Query untuk beragam syarat. Seperti yang telah Anda ketahui, syarat dalam Query dapat kita gunakana dengan menambahkan “WHERE“. Untuk referensi nya dapat dilihat di dokumen symfony tentang query.

Berikut ini contoh pengunaan syarat yang lumayan kompleks,

$this->data_user = Doctrine_Query::create()
	  ->from('User u')
	  ->where('u.name = "sule" ')
	  ->execute();

atau bisa dengan cara ini,

$this->data_user = Doctrine_Core::getTable('User')
	  ->createQuery('u')
	  ->where('u.name = "sule" ')
	  ->execute();

atau dengan cara ini juga bisa,

$this->data_user = Doctrine::getTable('User')
	  ->createQuery('u')
          ->where('u.name = "sule" ')
	  ->execute();

Ketiga cara diatas adalah sama, akan menghasilkan Query seperti ini,

$data_user = "SELECT * FROM user u WHERE (u.name = "sule")";

Jadi jangan bingung dengan penggunaan syntax Doctrine, karena akan ada banyak cara menggunakannya, tergantung kebutuhan.

Ok! kita akan coba bahas beberapa script penting yang ada di Doctrine. Anda perhatikan pola dari 3 Query diatas, secara umum adalah sama. Pertama pasti akan ada script Doctrine (atau Doctrine_Query atau Doctrine_Core). Selanjutnya akan dipilih table yang akan dikerjakan, bisa dengan getTable() atau from(). Lalu script ketiga yang penting adalah, where() untuk menambahkan syaratnya. Jangan ragu, Anda bisa mencoba untuk penggunaan where ini sama seperti yang ada di Query biasa (misal menggunakan AND, OR, =, LIKE, dsb). Dan terakhir Anda perlu menambahkan execute(), untuk eksekusi query Doctrine ini.

Selanjutnya kita akan mencoba query yang sedikit rumit lainnya,

$this->data_user = Doctrine_Query::create()
	  ->from('User u')
	  ->where(' u.name <> ? AND u.address LIKE ? ',
	    array('sule','dimana%'))
          ->orderBy('u.name ASC')
	  ->execute();

Kita menambahkan penggunaan ‘<>‘ untuk tidak sama dengan, dan ‘LIKE‘ untuk mengecek karakter yang sesuai. Value yang akan di cek dituliskan dengan tanda tanya (‘?‘), dan diisikan nilainya dalam bentuk array. Jadi, cara baca nya ada adalah seperti berikut ini, “cari yang username nya tidak sama dengan sule dan address nya mengandung kata dimana dengan akhiran bebas“. Kemudian akan diurutkan (orderBy) berdasarkan field name secara ascending (ASC). Untuk variasi selanjutnya, Anda bisa mencoba penggunaan limit, groupBy, where yang lebih rumit dan bermacam lainnya.

bersambung…


One response to “Belajar Doctrine Query Language (DQL)”

Leave a Reply

Your email address will not be published. Required fields are marked *