# Column
To display a column to your table, include a new Column::add() in the columns() method.
Place your code inside the method's return [] statement.
Example:
public function columns(): array
{
return [
Column::add('Id')
->data('id'),
Column::add('Last Name')
->data('last_name'),
Column::add('Created At')
->data('created_at')
->dateFormat(),
Column::add()
->actions(function(User $user) {
return join([
Button::edit('boilerplate.users.edit', $user),
Button::delete('boilerplate.users.edit', $user),
]);
}),
];
}
| method | description |
|---|---|
| add | Adds a new column |
| data | Links the column to an existing Datasource field |
| name | Relation name to use for eager loading relationships |
| filter | Implements a custom search for a specific column |
| filterOptions | Select options for the column filter |
| filterType | Select the type of the filter to apply |
| order | Allow to set a specific order query |
| fromNow | For dates, replace the date by a “from now” text |
| dateFormat | For dates, will replace the date by the localized date |
| dateRangeFilter | Attach a daterangepicker filter on a date column |
| notSearchable | Disables search (and filter) of the column |
| notSortable | Disables the sorting of the column |
| notOrderable | Alias of notSortable |
| orderData | Specify column index(es) to use for ordering |
| actions | Specific method to add actions buttons as a string |
| tooltip | Displays a tooltip when hovering over the column title |
| class | Sets the column class |
| width | Sets the column width |
| hidden | Hide the column |
| sum | Enable sum calculation in footer for numeric columns |
# add
Adds a new column to your DataTable. The method take one argument as column title, default is an empty string.
Column::add('My column title')
# data
Links the column to an existing Datasource field.
->data('last_name')
You can use a Closure to edit the column content.
->data('last_name', function(User $user) {
return Str::title($user->last_name);
})
Or to create a custom column
->data('custom_name', function(User $user) {
return $user->first_name.' '.$user->last_name;
})
In this case, you have to define a filter or disable the column filtering.
# name
When using Eloquent and eager loading relationships you have to specify the relation.column_name.
You also have to specify fields to get to avoid integrity constraints.
Example:
public function datasource()
{
return User::with('roles')->select('users.*');
}
Then to filter roles by name:
->name('roles.name')
# filter
In some cases, we need to implement a custom search for a specific column. To achieve this, you can use the filter method.
->filter(function ($query, $q) {
return $query->where(DB::raw('CONCAT_WS(first_name, " ", last_name)'), 'LIKE', "%$q%");
})
Specific case to filter on eager loaded model:
use Illuminate\Database\Eloquent\Builder;
->filter(function($query, $q) {
$query->whereHas('roles', function(Builder $query) use ($q) {
$query->where('name', '=', $q);
});
})
# filterOptions
Replaces the input text field by a select containing the options returned by this method.
->filterOptions(function () {
return Role::all()->pluck('display_name', 'name')->toArray();
})
If select must be multiple, set the second argument to true.
->filterOptions(function () {
return Role::all()->pluck('display_name', 'name')->toArray();
}, true)
# filterType
Sets the filter type to use.
->filterType('daterangepicker')
# order
In some cases, we need to implement a custom order query for a specific column. To achieve this, you can use the order method.
->order(function ($query, $direction) {
return $query->orderBy('field', $direction);
})
Authorized types are : text, daterangepicker, select, select-multiple
# fromNow
For dates, replace the date by a "from now" text.
->fromNow()
# dateFormat
For dates, will replace the date by the localized date using Moment.js formatting.
To enable a daterangepicker filter on this column, chain the dateRangeFilter method.
By default, it will use the locale boilerplate::date.YmdHis defined in the date.php language file:
->dateFormat()
This renders dates using the default format YYYY-MM-DD HH:mm:ss.
You can specify a custom format using Moment.js display format (opens new window):
->dateFormat('dddd D MMMM YYYY')
// Output: "Monday 15 January 2024"
->dateFormat('DD/MM/YYYY HH:mm')
// Output: "15/01/2024 14:30"
->dateFormat('MMM Do, YYYY')
// Output: "Jan 15th, 2024"
You can also use a Closure for advanced date formatting logic:
->dateFormat(function($data) {
return Carbon::createFromFormat('Y-m-d H:i:s', $data->created_at)->format('l F Y');
})
The boilerplate provides predefined date formats in resources/lang/{locale}/date.php:
| Key | Format | Example Output |
|---|---|---|
Ymd | YYYY-MM-DD | 2024-01-15 |
YmdHi | YYYY-MM-DD HH:mm | 2024-01-15 14:30 |
YmdHis | YYYY-MM-DD HH:mm:ss | 2024-01-15 14:30:25 |
YmdhiA | YYYY-MM-DD hh:mm A | 2024-01-15 02:30 PM |
YmdhisA | YYYY-MM-DD hh:mm:ss A | 2024-01-15 02:30:25 PM |
lFdY | dddd, MMMM Do YYYY | Monday, January 15th 2024 |
You can use these predefined formats:
->dateFormat(__('boilerplate::date.lFdY'))
// Renders: "Monday, January 15th 2024"
| Pattern | Description | Example |
|---|---|---|
YYYY | 4-digit year | 2024 |
YY | 2-digit year | 24 |
MMMM | Full month name | January |
MMM | Short month name | Jan |
MM | Month number (01-12) | 01 |
DDDD | Day of year (001-366) | 015 |
DD | Day of month (01-31) | 15 |
dddd | Full day name | Monday |
ddd | Short day name | Mon |
HH | Hour (00-23) | 14 |
hh | Hour (01-12) | 02 |
mm | Minute (00-59) | 30 |
ss | Second (00-59) | 25 |
A | AM/PM | PM |
# dateRangeFilter
Attach a daterangepicker (opens new window) filter to a date column. The filter sends a YYYY-MM-DD HH:mm:ss|YYYY-MM-DD HH:mm:ss value that is used to apply a whereBetween clause on the underlying database column.
By default, the filter targets the qualified column name set with name or, as a fallback, the data attribute:
Column::add(__('Created at'))
->data('created_at')
->dateFormat()
->dateRangeFilter(),
You can target a different database column by passing its name as argument. This is useful when the displayed column name differs from the column to filter on (for example with eager loaded relationships):
Column::add(__('Last login'))
->data('last_login')
->fromNow()
->dateRangeFilter('users.last_login'),
This method automatically sets the column filterType to daterangepicker and registers a custom filter closure. It can be combined with dateFormat or fromNow for the column rendering.
# notSearchable
Disables search (and filter) of the column.
->notSearchable()
# notSortable
Disables the sorting of the column.
->notSortable()
# notOrderable
Alias of notSortable
->notOrderable()
# orderData
Specify the column index(es) to use for ordering this column. This is useful when you want to order by a hidden column or by multiple columns.
// Order by column index
->orderData(0)
// Order by multiple column indexes
->orderData([0, 1])
Examples:
// Display formatted date but order by column index 2 (raw timestamp)
Column::add('Created')
->data('created_at', function($user) {
return $user->created_at->format('d/m/Y');
})
->orderData(2),
// Order by multiple columns (indexes 3 and 4 for last name, then first name)
Column::add('Name')
->data('name', function($user) {
return $user->first_name . ' ' . $user->last_name;
})
->orderData([3, 4]),
// Order by a hidden column (column index 5 is hidden)
Column::add('Status')
->data('status_label')
->orderData(5), // Orders by the hidden priority column
# actions
Specific method to add actions buttons as a string
->actions(function (User $user) {
return '<button type="button" data-id="'.$user->id.'">Edit</button>';
})
Or use the Button class
->actions(function (User $user) {
return join([
Button::show('boilerplate.users.show', $user),
Button::edit('boilerplate.users.edit', $user),
Button::add()
->link('https://sebastienheyd.github.io/boilerplate/')
->icon('help')
->color('info')
->make(),
]);
})
# tooltip
Displays a tooltip when hovering over the column title
->tooltip('My tooltip content')
# class
Sets the column class.
->class('text-primary text-nowrap')
# width
Sets the column width.
->width('40px')
# hidden
Hide the column.
->hidden()
# sum
Enables automatic sum calculation for numeric columns. When applied to a column, the sum of all visible values will be displayed in the table footer.
Column::add('Price')
->data('price')
->sum(),
Column::add('Quantity')
->data('quantity')
->sum(),
Features
- Automatic Calculation: Sums are calculated client-side using JavaScript for optimal performance
- Locale Formatting: Numbers are formatted according to the user's locale (e.g.,
1,234.56) - Dynamic Updates: Sums update automatically when filtering or searching the table
- Current Page Only: Calculations are performed on currently visible rows only
- The column data should contain numeric values
- Non-numeric values are treated as zero in calculations
- Works with both integer and decimal numbers
- The sum is calculated using
parseFloat()to handle both integers and decimals - Empty or non-numeric cells contribute 0 to the sum
- The footer is automatically generated when at least one column has sum enabled
- Multiple columns can have sum calculations simultaneously
- HTML-formatted columns: The sum calculation automatically extracts numeric values from HTML content (e.g.,
<span class="badge">5</span>→5) - Special handling for empty indicators: dots (
.) are treated as zero values