macam-macam Query Builder di CodeIgniter 3 secara lengkap beserta kegunaannya

Query Builder adalah fitur yang sangat powerful di CodeIgniter, memungkinkan Anda membuat kueri database yang kompleks dengan cara yang lebih mudah dibaca, lebih aman (melindungi dari SQL injection), dan lebih portabel antar database.

—–

## Dasar-dasar Query Builder

Sebelum masuk ke detail, pahami beberapa prinsip dasar:

* **Chaining Method:** Sebagian besar metode Query Builder dapat dirangkai (chained) bersama, membuat kode terlihat lebih rapi dan intuitif.
php
$this->db->select('nama, email')->from('pengguna')->where('status', 'aktif')->get();

* **Mengakses Database:** Anda selalu memulai dengan $this->db di dalam controller atau model Anda.
* **Hasil Kueri:** Metode $this->db->get() atau $this->db->get_where() akan mengembalikan **objek result**. Untuk mendapatkan data, Anda perlu memanggil metode dari objek tersebut, seperti result(), result_array(), row(), atau row_array().

—–

## Kategori Utama Metode Query Builder

Query Builder dapat dikelompokkan berdasarkan fungsinya:

### 1\. Metode SELECT

Digunakan untuk menentukan kolom apa yang ingin Anda ambil dari tabel.

* **$this->db->select('kolom1, kolom2, ...')**
* **Kegunaan:** Menentukan kolom-kolom spesifik yang ingin diambil. Jika tidak disebutkan, semua kolom (SELECT *) akan diambil secara default.
* **Contoh:**
php
$this->db->select('nama, email');
$query = $this->db->get('pengguna'); // SELECT nama, email FROM pengguna

* **$this->db->select_max('kolom')**
* **Kegunaan:** Mengambil nilai maksimum dari sebuah kolom.
* **Contoh:**
php
$this->db->select_max('gaji');
$query = $this->db->get('karyawan'); // SELECT MAX(gaji) FROM karyawan

* **$this->db->select_min('kolom')**
* **Kegunaan:** Mengambil nilai minimum dari sebuah kolom.
* **Contoh:**
php
$this->db->select_min('harga');
$query = $this->db->get('produk'); // SELECT MIN(harga) FROM produk

* **$this->db->select_avg('kolom')**
* **Kegunaan:** Mengambil nilai rata-rata dari sebuah kolom.
* **Contoh:**
php
$this->db->select_avg('nilai');
$query = $this->db->get('siswa'); // SELECT AVG(nilai) FROM siswa

* **$this->db->select_sum('kolom')**
* **Kegunaan:** Menghitung total jumlah dari sebuah kolom.
* **Contoh:**
php
$this->db->select_sum('jumlah_item');
$query = $this->db->get('pesanan'); // SELECT SUM(jumlah_item) FROM pesanan

—–

### 2\. Metode FROM

Digunakan untuk menentukan tabel dari mana data akan diambil.

* **$this->db->from('nama_tabel')**
* **Kegunaan:** Menentukan tabel utama untuk kueri.
* **Contoh:**
php
$this->db->select('*');
$this->db->from('produk');
$query = $this->db->get(); // SELECT * FROM produk

* **$this->db->get('nama_tabel')**
* **Kegunaan:** Metode ini adalah kombinasi dari from() dan eksekusi kueri SELECT. Ini adalah cara paling umum untuk mengambil data.
* **Contoh:**
php
$query = $this->db->get('pengguna'); // SELECT * FROM pengguna

* **$this->db->get_where('nama_tabel', 'kondisi')**
* **Kegunaan:** Cara singkat untuk melakukan SELECT dengan kondisi WHERE.
* **Contoh:**
php
$query = $this->db->get_where('pengguna', array('id' => 1, 'status' => 'aktif'));
// SELECT * FROM pengguna WHERE id = 1 AND status = 'aktif'

—–

### 3\. Metode JOIN

Digunakan untuk menggabungkan data dari dua atau lebih tabel berdasarkan kolom terkait.

* **$this->db->join('tabel_lain', 'kondisi_join', '[tipe_join]')**
* **Kegunaan:** Menambahkan klausa JOIN ke kueri.
* **kondisi_join:** Biasanya berupa tabel1.kolom = tabel2.kolom.
* **tipe_join (opsional):** LEFT, RIGHT, OUTER, INNER, LEFT OUTER, RIGHT OUTER. Defaultnya adalah INNER JOIN.
* **Contoh (INNER JOIN):**
php
$this->db->select('produk.nama_produk, kategori.nama_kategori');
$this->db->from('produk');
$this->db->join('kategori', 'produk.id_kategori = kategori.id_kategori');
$query = $this->db->get();
// SELECT produk.nama_produk, kategori.nama_kategori FROM produk INNER JOIN kategori ON produk.id_kategori = kategori.id_kategori

* **Contoh (LEFT JOIN):**
php
$this->db->select('pesanan.id_pesanan, pengguna.nama');
$this->db->from('pesanan');
$this->db->join('pengguna', 'pesanan.id_pengguna = pengguna.id_pengguna', 'left');
$query = $this->db->get();
// SELECT pesanan.id_pesanan, pengguna.nama FROM pesanan LEFT JOIN pengguna ON pesanan.id_pengguna = pengguna.id_pengguna

—–

### 4\. Metode WHERE

Digunakan untuk memfilter hasil kueri berdasarkan kondisi tertentu.

* **$this->db->where('kolom', 'nilai')**
* **Kegunaan:** Menambahkan klausa WHERE dengan kondisi 'kolom' = 'nilai'.
* **Contoh:**
php
$this->db->where('status', 'aktif');
$query = $this->db->get('pengguna'); // WHERE status = 'aktif'

* **$this->db->where(array('kolom1' => 'nilai1', 'kolom2' => 'nilai2'))**
* **Kegunaan:** Menambahkan beberapa kondisi WHERE dengan operator AND.
* **Contoh:**
php
$this->db->where(array('status' => 'aktif', 'usia >' => 25));
$query = $this->db->get('pengguna'); // WHERE status = 'aktif' AND usia > 25

* **$this->db->or_where('kolom', 'nilai')**
* **Kegunaan:** Menambahkan klausa WHERE dengan operator OR.
* **Contoh:**
php
$this->db->where('status', 'aktif');
$this->db->or_where('status', 'pending');
$query = $this->db->get('pengguna'); // WHERE status = 'aktif' OR status = 'pending'

* **$this->db->where_in('kolom', array('nilai1', 'nilai2'))**
* **Kegunaan:** Menambahkan klausa WHERE IN.
* **Contoh:**
php
$id_pengguna = array(1, 3, 5);
$this->db->where_in('id', $id_pengguna);
$query = $this->db->get('pengguna'); // WHERE id IN (1, 3, 5)

* **$this->db->or_where_in('kolom', array('nilai1', 'nilai2'))**
* **Kegunaan:** Menambahkan klausa WHERE IN dengan operator OR.
* **$this->db->where_not_in('kolom', array('nilai1', 'nilai2'))**
* **Kegunaan:** Menambahkan klausa WHERE NOT IN.
* **Contoh:**
php
$id_pengguna = array(2, 4);
$this->db->where_not_in('id', $id_pengguna);
$query = $this->db->get('pengguna'); // WHERE id NOT IN (2, 4)

* **$this->db->or_where_not_in('kolom', array('nilai1', 'nilai2'))**
* **Kegunaan:** Menambahkan klausa WHERE NOT IN dengan operator OR.
* **$this->db->like('kolom', 'nilai')**
* **Kegunaan:** Menambahkan klausa LIKE (untuk pencarian parsial). Secara default, menambahkan wildcard % di kedua sisi (%nilai%).
* **Contoh:**
php
$this->db->like('nama', 'adi');
$query = $this->db->get('pengguna'); // WHERE nama LIKE '%adi%'

* **$this->db->or_like('kolom', 'nilai')**
* **Kegunaan:** Menambahkan klausa LIKE dengan operator OR.
* **$this->db->not_like('kolom', 'nilai')**
* **Kegunaan:** Menambahkan klausa NOT LIKE.
* **$this->db->or_not_like('kolom', 'nilai')**
* **Kegunaan:** Menambahkan klausa NOT LIKE dengan operator OR.

—–

### 5\. Metode ORDER BY, GROUP BY, LIMIT, OFFSET

Digunakan untuk mengurutkan, mengelompokkan, dan membatasi hasil.

* **$this->db->order_by('kolom', '[arah]')**
* **Kegunaan:** Mengurutkan hasil. arah bisa ASC (ascending) atau DESC (descending). Defaultnya ASC.
* **Contoh:**
php
$this->db->order_by('nama', 'ASC');
$this->db->order_by('usia', 'DESC'); // ORDER BY nama ASC, usia DESC
$query = $this->db->get('pengguna');

* **$this->db->group_by('kolom')**
* **Kegunaan:** Mengelompokkan hasil berdasarkan satu atau lebih kolom. Sering digunakan dengan fungsi agregat (SUM, COUNT, dll.).
* **Contoh:**
php
$this->db->select('kategori_id, COUNT(id) as total_produk');
$this->db->group_by('kategori_id');
$query = $this->db->get('produk'); // GROUP BY kategori_id

* **$this->db->having('kondisi')**
* **Kegunaan:** Mirip dengan WHERE, tetapi digunakan untuk memfilter hasil setelah GROUP BY.
* **Contoh:**
php
$this->db->select('kategori_id, COUNT(id) as total_produk');
$this->db->group_by('kategori_id');
$this->db->having('total_produk >', 10);
$query = $this->db->get('produk'); // HAVING total_produk > 10

* **$this->db->limit('jumlah', '[offset]')**
* **Kegunaan:** Membatasi jumlah baris yang dikembalikan. offset (opsional) menentukan baris awal.
* **Contoh:**
php
$this->db->limit(10, 20); // LIMIT 20, 10 (mulai dari baris ke-21, ambil 10 baris)
$query = $this->db->get('artikel');

—–

### 6\. Metode INSERT

Digunakan untuk menambahkan data baru ke tabel.

* **$this->db->insert('nama_tabel', $data)**
* **Kegunaan:** Memasukkan satu baris data ke tabel. $data adalah array asosiatif di mana kunci adalah nama kolom dan nilai adalah nilai yang ingin dimasukkan.
* **Contoh:**
php
$data = array(
'nama' => 'Budi',
'email' => 'budi@example.com',
'usia' => 30
);
$this->db->insert('pengguna', $data);
echo $this->db->affected_rows(); // Mengembalikan jumlah baris yang terpengaruh (biasanya 1)
echo $this->db->insert_id(); // Mengembalikan ID yang terakhir dimasukkan

* **$this->db->insert_batch('nama_tabel', $data)**
* **Kegunaan:** Memasukkan beberapa baris data sekaligus ke tabel. $data adalah array dari array asosiatif.
* **Contoh:**
php
$data = array(
array('nama' => 'Siti', 'email' => 'siti@example.com'),
array('nama' => 'Joko', 'email' => 'joko@example.com')
);
$this->db->insert_batch('pengguna', $data);

—–

### 7\. Metode UPDATE

Digunakan untuk mengubah data yang sudah ada di tabel.

* **$this->db->update('nama_tabel', $data)**
* **Kegunaan:** Memperbarui data di tabel. **Penting:** Jika tidak ada kondisi WHERE yang ditentukan, semua baris di tabel akan diperbarui\!
* **Contoh:**
php
$data = array('status' => 'nonaktif');
$this->db->where('id', 1);
$this->db->update('pengguna', $data); // UPDATE pengguna SET status = 'nonaktif' WHERE id = 1
echo $this->db->affected_rows(); // Mengembalikan jumlah baris yang terpengaruh

* **$this->db->update_batch('nama_tabel', $data, 'kolom_identifikasi')**
* **Kegunaan:** Memperbarui beberapa baris sekaligus berdasarkan kolom identifikasi. $data adalah array dari array asosiatif, dan kolom_identifikasi adalah nama kolom yang digunakan untuk WHERE di setiap update.
* **Contoh:**
php
$data = array(
array('id' => 1, 'status' => 'aktif'),
array('id' => 2, 'status' => 'nonaktif')
);
$this->db->update_batch('pengguna', $data, 'id');
/*
UPDATE pengguna SET status = CASE
WHEN id = 1 THEN 'aktif'
WHEN id = 2 THEN 'nonaktif'
ELSE status
END
WHERE id IN (1, 2)
*/

* **$this->db->set('kolom', 'nilai')**
* **Kegunaan:** Mengatur nilai kolom untuk operasi INSERT atau UPDATE. Berguna untuk nilai yang bukan string biasa, atau untuk menggabungkan string.
* **Contoh (Update):**
php
$this->db->set('views', 'views + 1', FALSE); // FALSE mencegah SQL escape
$this->db->where('id', 5);
$this->db->update('artikel'); // UPDATE artikel SET views = views + 1 WHERE id = 5

—–

### 8\. Metode DELETE

Digunakan untuk menghapus data dari tabel.

* **$this->db->delete('nama_tabel')**
* **Kegunaan:** Menghapus baris dari tabel. **Penting:** Jika tidak ada kondisi WHERE yang ditentukan, semua baris akan dihapus\!
* **Contoh:**
php
$this->db->where('status', 'nonaktif');
$this->db->delete('pengguna'); // DELETE FROM pengguna WHERE status = 'nonaktif'
echo $this->db->affected_rows(); // Mengembalikan jumlah baris yang terhapus

* **$this->db->delete('nama_tabel', array('kolom' => 'nilai'))**
* **Kegunaan:** Cara singkat untuk menghapus dengan kondisi WHERE sederhana.
* **Contoh:**
php
$this->db->delete('pengguna', array('id' => 5)); // DELETE FROM pengguna WHERE id = 5

—–

### 9\. Utility / Helper Metode Query Builder

Beberapa metode lain yang berguna untuk membantu kueri Anda.

* **$this->db->count_all('nama_tabel')**
* **Kegunaan:** Mengembalikan jumlah total baris dalam tabel.
* **Contoh:**
php
$total_pengguna = $this->db->count_all('pengguna'); // SELECT COUNT(*) FROM pengguna

* **$this->db->count_all_results('nama_tabel')**
* **Kegunaan:** Mengembalikan jumlah total baris berdasarkan kueri Query Builder yang telah dibangun sebelumnya (misalnya, dengan kondisi WHERE atau JOIN).
* **Contoh:**
php
$this->db->like('nama', 'andi');
$jumlah_andi = $this->db->count_all_results('pengguna'); // SELECT COUNT(*) FROM pengguna WHERE nama LIKE '%andi%'

* **$this->db->empty_table('nama_tabel')**
* **Kegunaan:** Menghapus semua data dari tabel, tetapi tidak mereset auto-increment ID. Mirip dengan TRUNCATE TABLE tetapi menggunakan DELETE FROM.
* **Contoh:**
php
$this->db->empty_table('log_aktivitas'); // DELETE FROM log_aktivitas

* **$this->db->truncate('nama_tabel')**
* **Kegunaan:** Menghapus semua data dari tabel dan mereset auto-increment ID. Lebih efisien daripada empty_table() untuk tabel besar.
* **Contoh:**
php
$this->db->truncate('sesi'); // TRUNCATE TABLE sesi

* **$this->db->get_compiled_select('nama_tabel')** (dan sejenisnya untuk insert/update/delete)
* **Kegunaan:** Mengembalikan string SQL yang telah dikompilasi oleh Query Builder TANPA menjalankannya. Sangat berguna untuk debugging.
* **Contoh:**
php
$this->db->select('nama')->where('id >', 10);
$sql_query = $this->db->get_compiled_select('pengguna');
echo $sql_query; // Output: SELECT
nama FROM pengguna WHERE id > 10

* **$this->db->last_query()**
* **Kegunaan:** Mengembalikan string SQL dari kueri terakhir yang dijalankan secara fisik ke database. Juga sangat berguna untuk debugging.
* **Contoh:**
php
$this->db->get('pengguna');
echo $this->db->last_query(); // Output: SELECT * FROM
pengguna

* **$this->db->limit($value)** dan **$this->db->offset($value)**
* **Kegunaan:** Alternatif untuk membatasi dan menggeser hasil.
* **Contoh:**
php
$this->db->limit(10);
$this->db->offset(20);
$query = $this->db->get('produk'); // LIMIT 10 OFFSET 20

—–

## Mengapa Menggunakan Query Builder?

* **Keamanan:** Secara otomatis melakukan *escaping* pada nilai-nilai yang dimasukkan, melindungi dari serangan SQL Injection.
* **Keterbacaan:** Membuat kueri SQL lebih mudah dibaca dan dipahami, terutama untuk kueri yang kompleks.
* **Fleksibilitas:** Memungkinkan Anda membangun kueri secara dinamis berdasarkan kondisi atau input pengguna.
* **Portabilitas:** Kueri yang ditulis dengan Query Builder umumnya bekerja di berbagai jenis database yang didukung oleh CodeIgniter (MySQL, PostgreSQL, SQLite, dsb.) tanpa perubahan kode yang signifikan.
* **Debugging:** Metode seperti get_compiled_select() dan last_query() mempermudah proses debugging dengan menunjukkan SQL yang sebenarnya dibuat.

—–

Dengan memahami dan mempraktikkan penggunaan berbagai metode Query Builder ini, Anda akan dapat menulis kueri database yang efisien, aman, dan mudah dikelola di proyek CodeIgniter 3 Anda. Selamat belajar\!

Apakah ada bagian tertentu dari Query Builder yang ingin Anda pelajari lebih dalam, atau Anda ingin melihat contoh penggunaannya dalam skenario spesifik?