sooxiaotong / eloquent-sortable
为 eloquent 模型提供排序行为
Requires
- php: ^7.2
- laravel/framework: ~5.8.0
Requires (Dev)
- orchestra/testbench: ~3.8.0
- phpunit/phpunit: ^8.0
README
本包提供了一种特性,可以为 Eloquent 模型添加排序行为。
模型新记录的排序列值由该模型所有记录的排序列最大值加 1 确定。
该包还提供了一种查询范围,可以以正确的顺序检索所有记录。
Spatie 是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到所有开源项目的概述 在这里。
安装
本包可以通过 Composer 安装。
composer require spatie/eloquent-sortable
使用方法
要将排序行为添加到您的模型中,您必须
- 实现
Spatie\EloquentSortable\Sortable接口。 - 使用特性
Spatie\EloquentSortable\SortableTrait。 - 可选地指定用作排序列的列。默认为
order_column。
示例
use Spatie\EloquentSortable\Sortable; use Spatie\EloquentSortable\SortableTrait; class MyModel extends Eloquent implements Sortable { use SortableTrait; public $sortable = [ 'order_column_name' => 'order_column', 'sort_when_creating' => true, ]; ... }
如果您未设置 $sortable['order_column_name'] 的值,则包将假设您的排序列名称为 order_column。
如果您未设置 $sortable['sort_when_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 //the trait also provides the ordered query scope $orderedRecords = 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->moveBefore($anotherModel); $myModel->moveAfter($anotherModel);
分组
方法 1
如果您的模型/表有一个分组字段(通常是外键):id, user_id, title, order_column,并且您希望上述方法考虑这一点,您可以在模型中创建一个 buildSortQuery 方法
public function buildSortQuery() { return static::query()->where('user_id', $this->user_id); }
这将限制计算仅限于模型实例的字段值。
方法 2
您可以在模型中按列分组排序,将以下内容添加到您的模型中
public $sortable = [ ... 'group_column_name' => 'group_column', 'sort_by_group' => true, ];
测试
该包包含一些集成/烟雾测试,使用 Orchestra 设置。测试可以通过 phpunit 运行。
$ vendor/bin/phpunit
变更日志
请参阅 CHANGELOG 了解最近更改的详细信息。
贡献
请参阅 CONTRIBUTING 了解详细信息。
安全
如果您发现任何安全相关的问题,请通过电子邮件 freek@spatie.be 而不是使用问题跟踪器。
明信片软件
您可以使用此包,但如果它进入您的生产环境,我们非常感谢您从您家乡寄给我们一张明信片,说明您正在使用我们的哪个包。
我们的地址是:Spatie,Samberstraat 69D,2060 安特卫普,比利时。
我们将发表所有收到的明信片 在我们的公司网站上。
鸣谢
替代方案
支持我们
Spatie 是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到所有开源项目的概述 在这里。
您的业务是否依赖于我们的贡献?请通过Patreon联系我们并支持我们。所有承诺都将用于分配人力维护和开发新酷炫的功能。
许可证
MIT许可证(MIT)。更多信息请参阅许可证文件。