mzprog/datatables
简单易用的laravel/livewire datatable
Requires
- livewire/livewire: ^2.10
README
用少量代码创建更好的表格。
安装
简单地通过以下方式安装包
composer require mzprog/datatables
确保已经安装了livewire,并将样式和脚本添加到blade布局中: @livewireStyles 和 @livewireScripts
基本用法
- 创建一个没有视图文件且没有
render方法的livewire组件。 - 该组件应扩展
Mzprog\Datatables\Datatable - 在你的组件中添加
columns方法public function columns(): array;- 这应返回一个
Mzprog\Datatables\Column的数组
- 添加
query方法以拥有主查询public function query() : Builder
列类
只需在您的列数组中添加 Column::name('id'),它就会添加并显示在您的表中,但标签将显示为 Id。
要更改标签名称,请使用第二个参数 Column::name('id', 'ID')。
该名称将用作数组索引,默认情况下为数据库字段。
field 方法用于允许您为列使用不同的键,如下例所示(orderable& edit 将稍后解释)
Column::name('added')->field('created_at')
->orderable()
->edit(fn($row) => $row->created_at->diffForHumans()),
我们已更改了 created_at 的格式,但无法将其存储在相同的属性中(因为它被转换为日期,并作为 getCreateAtAttribute 工作)。
因此,当使用 orderable 时,它将根据 created_at 进行排序。
edit 方法用于更改或添加数据。
它接受带有当前原始数据的回调函数作为参数,例如
Column::name('full_name', 'Name)
->edit(fn($raw) => "{$raw->first_name} {$raw->last_name}")
orderable 方法将允许您通过点击列名来对列进行排序。它将根据您的字段名称对数据进行排序,除非您添加一个回调函数作为参数。回调函数参数为:查询 Builder 和排序方向,例如
return [
Column::name('id', 'ID')->orderable(),
Column::name('full_name', 'Name)
->orderable(fn($q, $dir) => $q->orderBy('first_name', $dir)->orderBy('last_name', $dir))
->edit(fn($raw) => "{$raw->first_name} {$raw->last_name}"),
];
searchable 方法类似于 orderable,回调函数将传递搜索关键字而不是排序方向,例如
Column::name('full_name', 'Name)
->searchable(
fn($q, $keyword) => $q
->where(DB::raw('CONCAT(first_name," ", last_name)'), 'like', "%${keyword}%")
)
->orderable(fn($q, $dir) => $q->orderBy('first_name', $dir)->orderBy('last_name', $dir))
->edit(fn($raw) => "{$raw->first_name} {$raw->last_name}"),
raw 方法用于在表中打印 HTML。例如
Column::name('actions')->raw()
->edit(fn($row) => '<a href="' . route('users.show',['user' => $row->id]) . '" >View</a>';
过滤器类
如果您想选择一个或多个值作为过滤器,例如您只想查看今天的行,可以使用以下方法
public function filters()
{
return [
Filter::name('date', 'Select a Date'),
];
}
这将允许您通过 date 列从表中过滤,您还可以省略标签名称,默认情况下将显示为 Date。
您还可以使用自定义数据和过滤器
示例 1(如果您想根据名称的第一个字母进行过滤)
Filter::name('name')->options(function () {
$options = User::query()
->select([
DB::raw('LEFT(name,1) as letter'),
DB::raw('COUNT(*) as total')
])->groupBy('letter')->get();
return $options->map(fn ($d) => [
'value' => $d['letter'],
'name' => "Starts with '{$d['letter']}'",
'total' => $d['total'],
])->toArray();
})
->filter(function (Builder $query, array $values) {
$query->whereIn(DB::raw('LEFT(name,1)'), $values);
})
对于 options,您需要返回一个选项数组,每个选项具有(名称、值、总数)。
filter 如果选择此过滤器,您可以向提供的查询添加条件,并将获得所选值的数组。
示例 2(按 success:success,fail 过滤)
Filter::name('success')->options(function () {
return [
[
'name' => 'Success',
'value' => '>=',
'total' => Exam::where('points', ">=", 50)->count()
],
[
'name' => 'Fail',
'value' => '<',
'total' => Exam::where('points', "<", 50)->count()
],
];
})
->filter(function (Builder $query, array $values) {
if(count($values) ==2) return;
$val = current($values);
$query->whereIn('points', $val, 50);
})