Simplify your Datatables server-side processing effortlessly using our lightning-fast PHP library, streamlining your workflow seamlessly.

Fund package maintenance!

Installs: 113 574

Dependents: 0

Suggesters: 0

Security: 0

Stars: 263

Watchers: 20

Forks: 89

Open Issues: 6

2.3.16 2024-06-12 14:59 UTC

This package is auto-updated.

Last update: 2024-06-24 21:10:28 UTC


Datatables library for PHP

Latest Stable Version PHP Composer license

Simplify your Datatables server-side processing effortlessly using our lightning-fast PHP library, streamlining your workflow seamlessly. Live Demo



NOTE: version 2.0+ requires php 7.1.3+ (php supported versions)

The recommended way to install the library is with Composer

If you haven't started using composer, I highly recommend you to use it.

Put a file named composer.json at the root of your project, containing this information:

    "require": {
       "ozdemir/datatables": "2.*"

And then run:

composer install

Or just run :

composer require ozdemir/datatables

Add the autoloader to your project:


    require_once 'vendor/autoload.php';

You're now ready to begin using the Datatables php library.

    require_once 'vendor/autoload.php';

    use Ozdemir\Datatables\Datatables;
    use Ozdemir\Datatables\DB\MySQL;

    $config = [ 'host'     => 'localhost',
                'port'     => '3306',
                'username' => 'homestead',
                'password' => 'secret',
                'database' => 'sakila' ];

    $dt = new Datatables( new MySQL($config) );

    $dt->query('Select film_id, title, description from film');

    echo $dt->generate();

If you are using a php framework such as codeigniter or laravel, you can use the relevant database adapter.

// Codeigniter 4 Example


namespace App\Controllers;

use Config\Database;
use Ozdemir\Datatables\Datatables;
use Ozdemir\Datatables\DB\Codeigniter4Adapter;

class Home extends BaseController
    public function index()
        return view('index');

    public function ajax()
        // CI 4 builder class
        $db = Database::connect();

        $builder = $db->table('Track');
        $builder->select('TrackId, Name, UnitPrice');

        // Datatables Php Library
        $datatables = new Datatables(new Codeigniter4Adapter);

        // using CI4 Builder

        // alternatively plain sql
        // $datatables->query('Select TrackId, Name, UnitPrice from Track');

        return $this->response->setJSON($datatables->generate()->toJson());
// Laravel Example

// routes/web.php 

use Ozdemir\Datatables\Datatables;
use Ozdemir\Datatables\DB\LaravelAdapter;

Route::get('/ajax/laravel', function () {

    $dt = new Datatables(new LaravelAdapter);

              'Title as Album',
              'MediaType.Name as MediaType',
          ->join('Album', 'Album.AlbumId', 'Track.AlbumId')
          ->join('MediaType', 'MediaType.MediaTypeId', 'Track.MediaTypeId')
    ); // same as the previous example, sql statement can be used.

    return $dt->generate();


This is the list of available public methods.

query($query) required

  • sets the sql query

generate() required

  • runs the queries and build outputs
  • returns the output as json
  • same as generate()->toJson()


  • returns the output as json
  • should be called after generate()


  • returns the output as array
  • should be called after generate()

add($column, function( $row ){})

  • adds extra columns for custom usage

edit($column, function($row){})

  • allows column editing

filter($column, function(){})

  • allows custom filtering
  • it has the methods below
    • escape($value)
    • searchValue()
    • defaultFilter()
    • between($low, $high)
    • whereIn($array)
    • greaterThan($value)
    • lessThan($value)


  • removes the column from output
  • It is useful when you only need to use the data in add() or edit() methods.


  • executes the query with the given column name and adds the returned data to the output with the distinctData key.


  • adds the given data to the output with the distinctData key.


  • returns column names (for dev purpose)


  • returns the sql query string that is created by the library (for dev purpose)


    require_once 'vendor/autoload.php';

    use Ozdemir\Datatables\Datatables;
    use Ozdemir\Datatables\DB\SQLite;

    $path = __DIR__ . '/../path/to/database.db';
    $dt = new Datatables( new SQLite($path) );

    $dt->query('Select id, name, email, age, address, plevel from users');

    $dt->edit('id', function($data){
        // return a link.
        return "<a href='user.php?id=" . $data['id'] . "'>edit</a>";

    $dt->edit('email', function($data){
        // masks email : mail@mail.com => m***@mail.com
        return preg_replace('/(?<=.).(?=.*@)/u','*', $data['email']);

    $dt->edit('address', function($data){
        // checks user access.
        $current_user_plevel = 4;
        if ($current_user_plevel > 2 && $current_user_plevel > $data['plevel']) {
            return $data['address'];

        return 'you are not authorized to view this column';
    $dt->hide('plevel'); // hides 'plevel' column from the output

    $dt->add('action', function($data){
        // returns a link in a new column
        return "<a href='user.php?id=" . $data['id'] . "'>edit</a>";

    $dt->filter('age', function (){
        // applies custom filtering.
        return $this->between(15, 30);

    echo $dt->generate()->toJson(); // same as 'echo $dt->generate()';

Road Map

  • better test suites for each class
  • improve integrations for php frameworks


DataTables > 1.10
PHP > 7.1.3


Copyright (c) 2015 Yusuf ÖZDEMİR, released under the MIT license

If you like the library please consider giving a star.