Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?


Failed to load latest commit information.
Latest commit message
Commit time
January 16, 2022 17:22
January 17, 2015 23:10
February 4, 2022 21:05
December 31, 2021 17:59
September 25, 2020 00:59

Datatables library for PHP

Latest Stable Version PHP Composer license

PHP Library to handle server-side processing for Datatables, in a fast and simple way. 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 () {

    $sqlBuilder = Track::select([
        'Title as Album',
        'MediaType.Name as MediaType',
        ->join('Album', 'Album.AlbumId', 'Track.AlbumId')
        ->join('MediaType', 'MediaType.MediaTypeId', 'Track.MediaTypeId');

    $dt = new Datatables(new LaravelAdapter);
    $dt->query($sqlBuilder); // 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 : => m***
        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

Buy Me A Coffee