Filter Column
Use the filterColumn() API when you need custom search logic for a specific column while letting the package handle other columns automatically.
Basic Usage
Filter a computed column that combines multiple fields:
Route::get('user-data', function () { $model = User::query()->select([ 'id', DB::raw("CONCAT(first_name, ' ', last_name) as fullname"), 'email', 'created_at', ]); return DataTables::eloquent($model) ->filterColumn('fullname', fn(Builder $query, $keyword) => $query->whereRaw( "CONCAT(first_name, ' ', last_name) LIKE ?", ["%{$keyword}%"] ) ) ->toJson();});
Closure Parameters
| Parameter | Type | Description |
|---|---|---|
$query |
Builder | The query builder instance |
$keyword |
string | The search keyword from DataTables |
Multiple Custom Columns
Define custom filters for different columns:
Route::get('user-data', function () { return DataTables::eloquent(User::query()) ->filterColumn('name', fn(Builder $query, $keyword) => $query->where('name', 'like', "%{$keyword}%") ) ->filterColumn('email', fn(Builder $query, $keyword) => $query->where('email', 'like', "%{$keyword}%") ) ->filterColumn('status', fn(Builder $query, $keyword) => $query->where('status', $keyword) ) ->toJson();});
OR Conditions Across Columns
Search across multiple columns with OR logic:
Route::get('user-data', function () { return DataTables::eloquent(User::query()) ->filterColumn('name', function (Builder $query, $keyword) { $query->where(fn(Builder $q) => $q ->where('first_name', 'like', "%{$keyword}%") ->orWhere('last_name', 'like', "%{$keyword}%") ->orWhereRaw( "CONCAT(first_name, ' ', last_name) LIKE ?", ["%{$keyword}%"] ) ); }) ->toJson();});
Numeric Comparison
Filter using comparison operators:
Route::get('user-data', function () { return DataTables::eloquent(User::query()) ->filterColumn('price', fn(Builder $query, $keyword) => $query->where('price', '>=', $keyword) ) ->toJson();});
Date Filtering
Parse and filter date values:
Route::get('user-data', function () { return DataTables::eloquent(User::query()) ->filterColumn('created_at', fn(Builder $query, $keyword) => $query->whereDate('created_at', Carbon::parse($keyword)->startOfDay()) ) ->toJson();});
With Table Aliases
When using table aliases in your query:
Route::get('user-data', function () { $model = DB::table('users as u')->select('u.*'); return DataTables::query($model) ->filterColumn('user_name', fn(Builder $query, $keyword) => $query->whereRaw( "CONCAT(u.first_name, ' ', u.last_name) LIKE ?", ["%{$keyword}%"] ) ) ->toJson();});
[!WARNING] Always include
select('table.*')when using table aliases to avoid id column conflicts.
Quick Reference
| Need | Solution |
|---|---|
| Custom logic for specific columns | ->filterColumn('name', fn(Builder $q, $k) => ...) |
| Complete query control | Manual Search |
| Simple wildcard matching | Smart Search |
| Pattern-based matching | Regex Search |
See Also
- Manual Search - Custom search logic
- Smart Search - Wildcard search
- Regex Search - Regular expression search