thoss/laravel-gap-sort

Eloquent 模型的间隙排序行为

v1.0.4 2023-04-26 13:58 UTC

This package is auto-updated.

Last update: 2024-09-05 10:14:40 UTC


README

Software License GitHub Workflow Status GitHub Workflow Status Latest Version Latest Version on Packagist

本包提供了一种使用“间隙”算法对表格中的项目进行排序的方法,这是一种比使用增量值更高效的重排表格项目的方法。它考虑了相邻项目顺序值之间的差距,并基于前一个和下一个项目的位置来计算主项目的新的顺序值。

因此,您只需一个操作就可以将项目排序到任何位置,您不需要更改其他项目!

Thoss\GapSort\SortModel 类的描述

需求

  • 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,
];

用法

要将可排序行为添加到您的模型,您必须

  1. 在您的模型中使用 Thoss\GapSort\Traits\Sortable 特性。
  2. 可选地指定用作顺序列的列。默认是 order_column
  3. 可选地指定您想要使用的排序项之间的间隙。默认是 order_gap

间隙越大,表格需要重新初始化的概率就越低

  1. 您可以使用顺序间隙初始化现有的表,可能在迁移文件中
dispatch(new SortModel(modelString: YourModel::class, initTable:true));

使用 REST API 进行排序

  1. 注册 /sort 路由
    (使用启用的资源注册器,您可以轻松添加 /sort 路由)
Route::resource('salutations', 'SalutationsController', ['with' => ['sort']]);
  1. 在您的控制器中调度 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

替代方案