Skip to content

Query Builder Data Source

Use Laravel's Query Builder as the data source for your DataTables. The Yajra\DataTables\QueryDataTable class handles the conversion of your Query Builder into a DataTables-compatible response.


Quick Start

use Yajra\DataTables\Facades\DataTables;
use Illuminate\Support\Facades\DB;
 
Route::get('user-data', function() {
$query = DB::table('users');
 
return DataTables::query($query)->toJson();
});

Adding Custom Columns

Add computed columns with closures:

use Yajra\DataTables\Facades\DataTables;
use Illuminate\Support\Facades\DB;
 
Route::get('user-data', function() {
$query = DB::table('users');
 
return DataTables::query($query)
->addColumn('full_name', function ($row) {
return $row->first_name . ' ' . $row->last_name;
})
->addColumn('action', function ($row) {
return '<button>Edit</button>';
})
->toJson();
});

[!NOTE] Added columns are computed and not part of the database, so search and sort are disabled by default. Use editColumn if you need search/sort functionality.


Filtering

Filter results in your query before passing to DataTables:

use Yajra\DataTables\Facades\DataTables;
use Illuminate\Support\Facades\DB;
 
Route::get('user-data', function() {
$query = DB::table('users')
->where('active', true)
->where('email_verified_at', '!=', null);
 
return DataTables::query($query)->toJson();
});

With Join Statements

Join related tables when building your query:

use Yajra\DataTables\Facades\DataTables;
use Illuminate\Support\Facades\DB;
 
Route::get('user-data', function() {
$query = DB::table('users')
->join('posts', 'users.id', '=', 'posts.user_id')
->select('users.*', DB::raw('COUNT(posts.id) as post_count'))
->groupBy('users.id');
 
return DataTables::query($query)->toJson();
});

When to Use Query Builder

Use Case Recommendation
Complex JOINs ✅ Perfect for Query Builder
Raw SQL ✅ Great for custom queries
Large datasets ✅ Efficient server-side processing
Simple CRUD tables Consider Eloquent

See Also