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
- Filter Column - Custom column filtering
- Smart Search - Wildcard search
- Regex Search - Regular expression search