Skip to content

Manual Search

Use the filter() API when you need complete control over how queries are filtered, bypassing the package's automatic search handling.


Manual Search Only

Disable global search and implement your own filtering:

use Illuminate\Database\Eloquent\Builder;
 
Route::get('user-data', function () {
return DataTables::eloquent(User::query())
->filter(function (Builder $query) {
$query->when(request('name'), fn(Builder $q) =>
$q->where('name', 'like', "%" . request('name') . "%")
);
$query->when(request('email'), fn(Builder $q) =>
$q->where('email', 'like', "%" . request('email') . "%")
);
})
->toJson();
});

Manual Search with Global Search

Enable global search alongside your custom filters by passing true as the second argument:

use Illuminate\Database\Eloquent\Builder;
 
Route::get('user-data', function () {
return DataTables::eloquent(User::query())
->filter(function (Builder $query) {
$query->when(request('name'), fn(Builder $q) =>
$q->where('name', 'like', "%" . request('name') . "%")
);
}, true) // Keep global search enabled
->toJson();
});

Advanced Filtering Examples

Filter by Multiple Criteria

use Illuminate\Database\Eloquent\Builder;
 
Route::get('user-data', function () {
return DataTables::eloquent(User::query())
->filter(function (Builder $query) {
$query->when(request('status'), fn(Builder $q, $v) =>
$q->where('status', $v)
);
$query->when(request('from_date'), fn(Builder $q, $v) =>
$q->whereDate('created_at', '>=', $v)
);
$query->when(request('to_date'), fn(Builder $q, $v) =>
$q->whereDate('created_at', '<=', $v)
);
$query->when(request('has_posts'), fn(Builder $q) =>
$q->has('posts')
);
})
->toJson();
});

OR Conditions

Search across multiple columns with OR logic:

use Illuminate\Database\Eloquent\Builder;
 
Route::get('user-data', function () {
return DataTables::eloquent(User::query())
->filter(function (Builder $query) {
$query->when(request('search'), function (Builder $q, $search) {
$q->where(fn(Builder $q) => $q
->where('name', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%")
);
});
})
->toJson();
});

Quick Reference

Need Solution
Complete query control ->filter() without second argument
Custom filters + global search ->filter(..., true)
Specific column logic Filter Column
Wildcard matching Smart Search

See Also