dykhuizen / laravel-datatable
一个包含构建数据表查询的 Laravel 扩展包
Requires
- php: ^7.3 | ^8.0
- illuminate/database: ^7.0 | ^8.0
- illuminate/support: ^7.0 | ^8.0
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.0
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
可排序
可排序列和排序顺序默认为 sortColumns
和 sortOrder
键。
这些键可以在每个模型实例上被重写,通过设置 $sortableColumnsKey
和 $sortableOrderKey
变量。
预期值为逗号分隔的值,并支持 HasOne
和 BelongsTo
关系
示例
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.*'); }
可搜索
可搜索列和搜索默认为 searchColumns
和 search
键。
这些键可以在每个模型实例上被重写,通过设置 $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 = status
和 filter_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; }); }
可分页和简单分页
可分页列默认为 page
和 per_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