mzprog/datatables

简单易用的laravel/livewire datatable

v0.1 2022-12-03 08:18 UTC

This package is auto-updated.

Last update: 2024-09-30 01:57:41 UTC


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);
})