Skip to content

Eloquent Data Source

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


Quick Start

use Yajra\DataTables\Facades\DataTables;
use App\Models\User;
 
Route::get('user-data', function() {
$model = User::query();
 
return DataTables::eloquent($model)->toJson();
});

With Relationships

Eager load relationships when building your query:

use Yajra\DataTables\Facades\DataTables;
use App\Models\User;
 
Route::get('user-data', function() {
$model = User::with(['posts', 'roles']);
 
return DataTables::eloquent($model)->toJson();
});

[!TIP] See Relationships for detailed information on searching and sorting eager loaded relationships.


With Count (and Sum)

Use withCount() and withSum() to efficiently load relation counts and sums, avoiding N+1 queries:

use Yajra\DataTables\Facades\DataTables;
use App\Models\User;
 
Route::get('user-data', function() {
$model = User::withCount('posts'); // Results in posts_count attribute
 
return DataTables::eloquent($model)
->addColumn('full_name', function (User $user) {
return $user->first_name . ' ' . $user->last_name;
})
->toJson();
});

When defining the column for count/sum values, use orderable(true) and searchable(false):

// In your Html builder:
Column::make('posts_count', 'posts_count')
->orderable(true)
->searchable(false),
 
// For sums, use Column::make with the sum attribute name:
Column::make('posts_sum_amount', 'posts_sum_amount')
->orderable(true)
->searchable(false),

[!WARNING] Never use $user->posts()->count() or $user->posts()->sum('amount') in addColumn — this causes N+1 queries. Always use withCount()/withSum() in the query and access the preloaded attribute.


With Query Scopes

Apply model scopes for filtered results:

use Yajra\DataTables\Facades\DataTables;
use App\Models\User;
 
Route::get('user-data', function() {
$model = User::active()->verified();
 
return DataTables::eloquent($model)->toJson();
});

Adding Custom Columns

Add computed columns with closures. Use a variable name matching the model (e.g., $user for User):

use Yajra\DataTables\Facades\DataTables;
use App\Models\User;
 
Route::get('user-data', function() {
$model = User::withCount('posts'); // Use withCount to avoid N+1
 
return DataTables::eloquent($model)
->addColumn('full_name', function (User $user) {
return $user->first_name . ' ' . $user->last_name;
})
->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 using Eloquent where clauses:

use Yajra\DataTables\Facades\DataTables;
use App\Models\User;
 
Route::get('user-data', function() {
$model = User::where('active', true)
->whereNotNull('email_verified_at');
 
return DataTables::eloquent($model)->toJson();
});

When to Use Eloquent

Use Case Recommendation
Standard CRUD tables ✅ Perfect for Eloquent
Relationships ✅ Automatic eager loading
Model scopes ✅ Clean, reusable filtering
Complex JOINs Consider Query Builder

See Also