metrixinfo/eloquent-sortable

支持多键分组的Laravel Eloquent模型排序特性

v0.8.1 2021-03-26 22:03 UTC

This package is auto-updated.

Last update: 2024-08-27 05:17:19 UTC


README

Build Status

此包提供了一个特性,为Eloquent模型添加排序行为。

新记录的排序列值由该模型所有或部分子组的记录的排序列的最大值加1确定。

此包还提供了一个查询作用域,用于获取所有记录的正确顺序。

此包是从流行的spatie/eloquent-sortable分支出来的,增加了在模型子集上进行排序以及将模型移动到特定位置的功能。

感谢Freek Van der Herten分享原始包。

安装

此包可以通过Composer安装。

composer require metrixinfo/eloquent-sortable

用法

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

  1. 使用特性 Metrix\EloquentSortable\Sortable
  2. 可选地指定用作排序列的列。默认为 display_order

示例

简单排序模型

use Metrix\EloquentSortable\Sortable;

class MyModel extends Eloquent
{

    use SortableTrait;

    public $sortable = [
        'sort_on_creating' => true,
        'order_column'      => 'display_order',
    ];
    
    ...
}

具有分组列的排序模型

use Metrix\EloquentSortable\Sortable;

class MyModel extends Eloquent
{

    use SortableTrait;

    public $sortable = [
        'sort_on_creating'  => true,
        'order_column'      => 'display_order',
        'group_column'      => 'group_id',
    ];
    
    ...
}

多列分组的排序模型

use Metrix\EloquentSortable\Sortable;

class MyModel extends Eloquent
{

    use SortableTrait;

    public $sortable = [
        'sort_on_creating'  => true,
        'order_column'      => 'display_order',
        'group_column'      => ['group_id','user_id'],
    ];
    
    ...
}

如果您没有为 $sortable['order_column'] 设置值,则包将假设排序列名为 display_order

如果您没有为 $sortable['sort_on_creating'] 设置值,则包将自动将下一个最高的排序值分配给新模型;

假设 MyModel 的数据库表为空

$myModel = new MyModel();
$myModel->save(); // order_column for this record will be set to 1

$myModel = new MyModel();
$myModel->save(); // order_column for this record will be set to 2

$myModel = new MyModel();
$myModel->save(); // order_column for this record will be set to 3

特性还提供了一个排序查询作用域。如果没有在查询中对分组列应用where()方法,则所有模型将按'group'和'display_order'排序返回,

$orderedRecords = MyModel::ordered()->get();

$groupedOrderedRecords = MyModel::where('group_id', 2)->ordered()->get();

$allRecords = MyModel::ordered()->get();

您可以使用 setNewOrder-方法为所有记录设置新的顺序

/**
 * the record for model id 3 will have record_column value 1
 * the record for model id 1 will have record_column value 2
 * the record for model id 2 will have record_column value 3
 */
MyModel::setNewOrder([3,1,2]);

可选地,您可以传递起始顺序号作为第二个参数。

/**
 * the record for model id 3 will have record_column value 11
 * the record for model id 1 will have record_column value 12
 * the record for model id 2 will have record_column value 13
 */
MyModel::setNewOrder([3,1,2], 10);

您还可以使用这些方法将模型向上或向下移动

$myModel->moveOrderDown();
$myModel->moveOrderUp();

您还可以将模型移动到第一个或最后一个位置

$myModel->moveToStart();
$myModel->moveToEnd();

您还可以交换两个模型的顺序

MyModel::swapOrder($myModel, $anotherModel);

您可以将模型移动到特定位置

$myModel->moveToPosition(4);

测试

此包包含一些集成/冒烟测试,使用Orchestra设置。测试可以通过从根目录的 ./bin/test.sh 脚本运行。

$ ./bin/test.sh

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件