thoss / laravel-gap-sort
Eloquent 模型的间隙排序行为
v1.0.4
2023-04-26 13:58 UTC
Requires
- php: ^8.1
- illuminate/database: ^9.0|^10.0
- illuminate/support: ^9.0|^10.0
- spatie/laravel-package-tools: ^1.9
Requires (Dev)
- nunomaduro/larastan: ^2.0
- orchestra/testbench: ^8.5
- pestphp/pest: ^2.5
- pestphp/pest-plugin-laravel: ^2.0
- phpunit/phpunit: ^10.1
README
本包提供了一种使用“间隙”算法对表格中的项目进行排序的方法,这是一种比使用增量值更高效的重排表格项目的方法。它考虑了相邻项目顺序值之间的差距,并基于前一个和下一个项目的位置来计算主项目的新的顺序值。
因此,您只需一个操作就可以将项目排序到任何位置,您不需要更改其他项目!
需求
- PHP 8.1
- Laravel 9/10
- 您的顺序列必须是整数(推荐使用无符号整数)
安装
您可以使用 composer 安装此包。
只需运行以下命令。
composer require thoss/laravel-gap-sort
可选地,您可以使用以下命令发布配置文件
php artisan vendor:publish --tag=gap-sort-config
这是将发布到 config/gap-sort.php
的文件内容
return [ /* * The name of the column that will be used to sort models. */ 'order_column' => 'order', /* * The gap between the sorted items */ 'order_gap' => 1000, /* * Indicates wheter the "/sort" route will be automaticaly added when you use the route ::register method */ 'resource_registrar_with_sort' => false, ];
用法
要将可排序行为添加到您的模型,您必须
- 在您的模型中使用
Thoss\GapSort\Traits\Sortable
特性。 - 可选地指定用作顺序列的列。默认是
order_column
。 - 可选地指定您想要使用的排序项之间的间隙。默认是
order_gap
。
间隙越大,表格需要重新初始化的概率就越低
- 您可以使用顺序间隙初始化现有的表,可能在迁移文件中
dispatch(new SortModel(modelString: YourModel::class, initTable:true));
使用 REST API 进行排序
- 注册
/sort
路由
(使用启用的资源注册器,您可以轻松添加/sort
路由)
Route::resource('salutations', 'SalutationsController', ['with' => ['sort']]);
- 在您的控制器中调度
SortModel
任务
use Thoss\GapSort\Requests\SortRequest; use Thoss\GapSort\SortModel; public function sort(SortRequest $request) { return $this->dispatchSync(new SortModel(MyModel::class)); }
带有 100 间隙的示例请求
Item1 被排序在 2 和 3 之间
Current List:
- Item1 (order 100)
- Item2 (order 200)
- Item3 (order 300)
POST /api/myresource/sort
{
"main": 1,
"previous": 2,
"next": 3,
}
After Sort:
- Item2 (order 200)
- Item1 (order 250)
- Item3 (order 300)
Item1 被排序到最后
Current List:
- Item1 (order 100)
- Item2 (order 200)
- Item3 (order 300)
POST /api/myresource/sort
{
"main": 1,
"previous": 3,
}
After Sort:
- Item2 (order 200)
- Item3 (order 300)
- Item1 (order 350)
Item3 被排序到第一个
Current List:
- Item1 (order 100)
- Item2 (order 200)
- Item3 (order 300)
POST /api/myresource/sort
{
"main": 3,
"next": 1,
}
After Sort:
- Item3 (order 50)
- Item1 (order 100)
- Item2 (order 200)
测试
composer test