PHPackages                             sejator/ci4-datatables - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. sejator/ci4-datatables

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

sejator/ci4-datatables
======================

Library DataTables server-side untuk CodeIgniter 4

v1.0.6(1mo ago)012MITPHPPHP &gt;=7.4

Since Dec 30Pushed 1mo agoCompare

[ Source](https://github.com/sejator/ci4-datatables)[ Packagist](https://packagist.org/packages/sejator/ci4-datatables)[ RSS](/packages/sejator-ci4-datatables/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (3)Dependencies (4)Versions (8)Used By (0)

📘 CI4 DataTables Helper
=======================

[](#-ci4-datatables-helper)

Library helper untuk integrasi jQuery DataTables (server-side) di CodeIgniter 4, dengan fokus:

✅ Aman
✅ Mudah dipakai
✅ Siap production

### Fitur Utama

[](#fitur-utama)

- Pagination (server-side)
- Searching (global search)
- Filtering (where &amp; conditional)
- Ordering
- Debug SQL lengkap
- Search aman (whitelist kolom)

### 1️⃣ Penggunaan Dasar

[](#1️⃣-penggunaan-dasar)

```
use Sejator\DataTables\DataTables;

return DataTables::from('users')
    ->select('id, name, email, status')
    ->searchable(['name', 'email']) // 🔒 whitelist kolom search
    ->make();
```

📌 Catatan Penting

- `searchable()` sangat direkomendasikan
- Kolom di luar whitelist tidak akan ikut di-search
- Jika searchable() tidak digunakan, fitur global search DataTables akan dinonaktifkan.

### 2️⃣ Dengan Filter (Where &amp; Conditional)

[](#2️⃣-dengan-filter-where--conditional)

Filter statis

```
return DataTables::from('users')
    ->select('id, name, email, status')
    ->where('status', 'active')
    ->searchable(['name', 'email'])
    ->make();
```

Filter dinamis (opsional)

```
$status = $this->request->getGetPost('status');

return DataTables::from('users')
    ->select('*')
    ->when($status, fn ($q, $v) => $q->where('status', $v))
    ->searchable(['name', 'email'])
    ->make();
```

✔ Jika $status kosong (null, ''), filter tidak diterapkan

- Ordering Column (Whitelist)

    Untuk mengaktifkan sorting pada kolom tertentu gunakan orderable().

    ```
    return DataTables::from('users')
      ->select('
          users.name AS nama,
          users.role AS role
      ')
      ->orderable([
          'nama' => 'users.name',
          'role' => 'users.role'
      ])
      ->make();
    ```
- Frontend:

```
{
 data: 'nama',
 name: 'nama'
}
```

### 3️⃣ Debug SQL Lengkap (Mode Debug)

[](#3️⃣-debug-sql-lengkap-mode-debug)

Digunakan untuk melihat seluruh query yang dipakai DataTables:

- Query data
- Count total
- Count filtered

```
return DataTables::from('users')
    ->select('id, name, email, status')
    ->where('status', 'active')
    ->searchable(['name', 'email'])
    ->debug()
    ->make();
```

Output JSON Debug:

```
{
  "debug": true,
  "queries": {
    "data": "SELECT id, name, email, status FROM users WHERE status = 'active' LIMIT 10 OFFSET 0",
    "count_all": "SELECT COUNT(*) FROM users",
    "count_filtered": "SELECT COUNT(*) FROM users WHERE status = 'active'"
  }
}
```

📌 Kegunaan debug

- Validasi pagination
- Cek search &amp; filter
- Audit performa query
- Troubleshooting hasil DataTables

### 4️⃣ Dump SQL Langsung (Development Only)

[](#4️⃣-dump-sql-langsung-development-only)

Digunakan saat development untuk dump SQL dan menghentikan eksekusi.

```
DataTables::from('users')
    ->select('*')
    ->where('status', 'inactive')
    ->ddSql();
```

Output:

```
SELECT * FROM users WHERE status = 'inactive'
```

⚠️ Jangan dipakai di production

### 5️⃣ Logging Query ke Log CI4

[](#5️⃣-logging-query-ke-log-ci4)

Query akan dicatat ke file log CI4:

📁 writable/logs/log-YYYY-MM-DD.php

```
DataTables::from('users')
    ->select('*')
    ->where('status', 'pending')
    ->logSql()
    ->make();
```

Contoh log:

```
DEBUG - DataTables SQL: SELECT * FROM users WHERE status = 'pending'
```

### 6️⃣ Search Aman (Whitelist Column)

[](#6️⃣-search-aman-whitelist-column)

📌 Wajib digunakan jika query menggunakan JOIN atau alias kolom.

Tanpa `searchable()`, DataTables dapat menghasilkan query tidak valid atau fitur pencarian tidak sesuai.

```
->searchable(['name', 'email'])
```

✔ Mencegah:

- SQL injection via DataTables request
- Search ke kolom yang tidak diinginkan

❌ Tanpa searchable():

- Semua kolom `searchable=true` dari frontend akan dipakai
- Kurang aman &amp; sulit dikontrol

### 7️⃣ Ringkasan Method Penting

[](#7️⃣-ringkasan-method-penting)

MethodFungsi`from($table)`Tentukan tabel`select()`Kolom yang diambil`where()`Filter data`when()`Filter kondisional`searchable()`Whitelist kolom search`orderBy()`Sorting manual`debug()`Tampilkan SQL lengkap`ddSql()`Dump SQL &amp; stop`logSql()`Log SQL ke CI4`make()` / `draw()`Eksekusi DataTables`withRelation()`Load relasi tanpa JOIN (lazy &amp; nested)📌 `make()` dan `draw()` setara (pilih salah satu untuk konsistensi)

### 🔄 reset()

[](#-reset)

Digunakan untuk mengembalikan DataTables ke kondisi awal.

📌 Wajib dipakai jika instance digunakan lebih dari sekali

```
$dt = DataTables::from('users');

$dt->where('status', 'active')->make();

$dt->reset()
   ->where('status', 'inactive')
   ->make();
```

### 8️⃣ Relasi Data (withRelation)

[](#8️⃣-relasi-data-withrelation)

Fitur `withRelation()` digunakan untuk memuat data relasi tanpa JOIN, sehingga:

✅ Aman untuk pagination ✅ Tidak menduplikasi row ✅ Performa lebih baik ✅ Cocok untuk server-side DataTables

Relasi akan dimuat setelah query utama dieksekusi dan disisipkan ke setiap row hasil.

#### 8.1️⃣ Penggunaan Dasar

[](#81️⃣-penggunaan-dasar)

```
return DataTables::from('izin')
    ->select('id, tanggal_mulai, status')
    ->withRelation(
        'izin_id',     // foreign key di tabel relasi
        'id',          // primary key di tabel utama
        'izin_histori',
        'izin_id, tanggal'
    )
    ->make();
```

Hasil data:

```
$row['izin_histori'] = [
    ['izin_id' => 1, 'tanggal' => '2024-01-01'],
    ['izin_id' => 1, 'tanggal' => '2024-01-02'],
];
```

#### 8.2️⃣ Lazy Load Relasi (Direkomendasikan)

[](#82️⃣-lazy-load-relasi-direkomendasikan)

Relasi hanya akan di-load jika benar-benar digunakan pada addColumn() atau editColumn().

```
return DataTables::from('izin')
    ->select('id, status')
    ->withRelation(
        'izin_id',
        'id',
        'izin_histori',
        'izin_id, tanggal',
        [
            'onlyIfUsedIn' => ['tanggal']
        ]
    )
    ->addColumn('tanggal', function ($row) {
        return implode(
            ', ',
            array_column($row->izin_histori, 'tanggal')
        );
    })
    ->make();
```

📌 Jika kolom `tanggal` tidak dipakai, query relasi tidak akan dijalankan.

#### 8.3️⃣ Nested Relation (Relasi Bertingkat)

[](#83️⃣-nested-relation-relasi-bertingkat)

Mendukung relasi di dalam relasi.

```
return DataTables::from('izin')
    ->select('id, status')
    ->withRelation(
        'izin_id',
        'id',
        'izin_histori',
        'id, izin_id, tanggal',
        [
            'nested' => [
                [
                    'foreignKey' => 'izin_histori_id',
                    'localKey'   => 'id',
                    'table'      => 'izin_histori_detail',
                    'columns'    => '*',
                ]
            ]
        ]
    )
    ->make();
```

Akses data:

```
$row->izin_histori[0]['izin_histori_detail']
```

#### 8.4️⃣ Kenapa withRelation Tidak Menggunakan JOIN?

[](#84️⃣-kenapa-withrelation-tidak-menggunakan-join)

❌ JOIN menyebabkan:

- Duplikasi row
- Pagination tidak akurat
- Count total &amp; filtered salah

✅ withRelation:

- Query utama tetap bersih
- Relasi di-load sekali (no N+1)
- Aman untuk DataTables server-side

#### 8.5️⃣ Rekomendasi Best Practice

[](#85️⃣-rekomendasi-best-practice)

- ✔ Gunakan withRelation() untuk data child (histori, detail, log)
- ✔ Aktifkan onlyIfUsedIn untuk performa optimal
- ✔ Gunakan JOIN hanya untuk data 1–1 yang memang ditampilkan langsung
- ✔ Hindari JOIN untuk data 1–N pada DataTables

###  Health Score

38

—

LowBetter than 84% of packages

Maintenance94

Actively maintained with recent releases

Popularity6

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity39

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~14 days

Total

6

Last Release

57d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/41ae14529ebbf15dc950f601622549ee46d893164fe7e4c1ed8bbdb2f43234ba?d=identicon)[sejator](/maintainers/sejator)

---

Top Contributors

[![sejator](https://avatars.githubusercontent.com/u/76089365?v=4)](https://github.com/sejator "sejator (13 commits)")

---

Tags

librarydatatablesdatatablecodeigniter4server-side

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/sejator-ci4-datatables/health.svg)

```
[![Health](https://phpackages.com/badges/sejator-ci4-datatables/health.svg)](https://phpackages.com/packages/sejator-ci4-datatables)
```

###  Alternatives

[yajra/laravel-datatables-oracle

jQuery DataTables API for Laravel

4.9k33.8M335](/packages/yajra-laravel-datatables-oracle)[league/iso3166

ISO 3166-1 PHP Library

69536.3M116](/packages/league-iso3166)[bllim/datatables

Server-side handler of DataTables Jquery Plugin for Laravel 4

261413.7k4](/packages/bllim-datatables)[nullref/yii2-datatables

Yii2 Extension for DataTables jQuery plug-in

7290.3k](/packages/nullref-yii2-datatables)[fedemotta/yii2-widget-datatables

DataTables widget for Yii2

34179.4k1](/packages/fedemotta-yii2-widget-datatables)[savannabits/primevue-datatables

Easy Laravel Server-Side implementation of PrimeVue Datatables

337.7k1](/packages/savannabits-primevue-datatables)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
