dykhuizen/laravel-datatable

一个包含构建数据表查询的 Laravel 扩展包

v2.1.3 2021-01-10 08:01 UTC

This package is auto-updated.

Last update: 2024-09-10 15:46:55 UTC


README

用于将请求转换为 Laravel 7+ 中的数据表响应的包,支持搜索、排序、过滤、分页和数据最小化。

设置

Composer

通过 Composer 引入此包

composer require dykhuizen/laravel-datatable

用法

在你的 Eloquent 模型中使用 Datatable 特性。此特性提供以下功能

  • 可排序 - 对指定列应用排序查询列表
  • 可搜索 - 对选定列应用搜索查询
  • 可过滤 - 根据选定列应用过滤列表到查询
  • 可分页 - 根据请求执行 $eloquent->get()$eloquent->paginate() 方法
  • 简单分页 - 根据请求执行 $eloquent->get()$eloquent->simplePaginate() 方法
  • 可选 - 选择要返回的响应数据
use Dykhuizen\Datatable;

use Illuminate\Database\Eloquent\Model;
use Dykhuizen\Datatable\Datatable;

class User extends Model 
{
    use Datatable;
}
GET https://:8080/api/users
sortColumns=name,id& 
sortOrder=asc,desc& 
searchColumns=name&
search=testingName&
page=1&
per_page=5&
filter=deleted_at&
filter_deleted_at=false&
selectableFields=id,name,role.name

可排序

可排序列和排序顺序默认为 sortColumnssortOrder 键。
这些键可以在每个模型实例上被重写,通过设置 $sortableColumnsKey$sortableOrderKey 变量。
预期值为逗号分隔的值,并支持 HasOneBelongsTo 关系

示例

sortColumns = 'id,username,role.id'
sortOrder = 'asc,desc,desc'

如果你希望按一个模型字段排序,该字段不存在于模型字段中,你可以选择性地定义一个 [property]Sortable 函数
以下是一个地址示例

public function addressSortable($query, $direction)
{
    return $query->join('profiles', 'users.id', '=', 'profiles.user_id')->orderBy('address', $direction)->select('users.*');
}

可搜索

可搜索列和搜索默认为 searchColumnssearch 键。
这些键可以在每个模型实例上被重写,通过设置 $searchableColumnsKey$searchableSearchKey 变量。
预期值为逗号分隔的值,并支持任何类型的关系

示例

searchColumns = 'username,profile.address'
search = 'phrase to search on'

如果你希望搜索一个模型字段中不存在的字段,你可以选择性地定义一个 [property]Searchable 函数
以下是一个地址示例

public function addressSearchable($query, $search)
{
    return $query->whereHas('profile', function($query) use ($search)
    {
        return $query->where('address', '=', $search);
    });
}

可过滤

可过滤列默认为 filter
这个键可以在每个模型实例上被重写,通过设置 $filterableFieldsKey 变量。
预期值为逗号分隔的值,并支持任何类型的关系。此外,过滤值应作为唯一字段传递。例如,按状态过滤需要存在键 filter = statusfilter_status = 'yes,no,maybe'

示例

filter = 'deleted_at,profile.deleted_at'
filter_deleted_at = 'false'
filter_profile.deleted_at = 'yes'

如果你希望过滤一个模型字段中不存在的字段或有唯一的过滤属性,你可以选择性地定义一个 [property]Filterable 函数
以下是一个地址示例

public function addressFilterable($query, $filters)
{
    return $query->where(function($query) use($filters) {
        foreach($filters as $filter) {
            switch($filters) {
                case 'local':
                    $query->orWhere(...);
                    break;
                case 'foreign':
                    $query->orWhere(...);
                    break;
                default:
                    $query->orWhere(...);
                    break;
            }
        }
        
        return $query;
    });
}

可分页和简单分页

可分页列默认为 pageper_page,与 Laravel 内置分页相同
这些键可以在每个模型实例上被重写,通过设置 $paginateablePageKey$paginateablePerPageKey 变量。
如果这些键存在,响应将进行分页。如果这些键不存在,将检查 $forcePagination 函数参数。如果为 true,则根据 Laravel 默认值进行分页。如果为 false,则通过 get() 方法检索结果。

示例

page = 1
per_page = 100

可选

可选列默认为 selectableFields
这个键可以在每个模型实例上被重写,通过设置 $selectableFieldsKey 变量
如果该字段存在,在调用 toArray() 方法之前,可选择的函数会将这些字段的静态属性设置为掩码
这个特质的目的是在向前端应用程序返回数据时减少响应大小
出于安全考虑,关系深度最大设置为3,如果在调用 toArray() 之前没有将关系加载到模型中,可选择的函数会执行 abort() 操作,因为这表明有人正在尝试动态加载关系,这可能会导致数据泄露

示例

selectableFields = id,profile.name,posts.id,posts.name