Skip to content
Icon

WARNING You're browsing the documentation for an upcoming version of Laravel DataTables. The documentation and features of this release are subject to change.

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