highsolutions / eloquent-sequence
一个用于简化Eloquent模型序列支持创建和管理的Laravel包,支持弹性配置。
Requires
- php: >=7.1.3|>=8.0.2
- illuminate/support: 5.*|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: 3.*|4.*|5.*|6.*|7.*|8.*|9.*
- phpunit/phpunit: 6.*|7.*|8.*|9.*|10.*|11.*
This package is auto-updated.
Last update: 2024-09-22 10:34:58 UTC
README
通过弹性配置简化Eloquent模型序列支持创建和管理。
安装
此包可以通过Composer安装
composer require highsolutions/eloquent-sequence
或者通过将以下行添加到Laravel web应用的composer.json
文件的require
部分中
"require": { "highsolutions/eloquent-sequence": "3.*" }
运行composer update
以安装包。
版本兼容性
更新Eloquent模型
use HighSolutions\EloquentSequence\Sequence; class Section extends Model { use Sequence; public function sequence() { return [ 'group' => 'article_id', 'fieldName' => 'seq', ]; } }
注意:作为字段名称,不要使用该类中任何现有方法的名称,包括sequence
,因为这将不起作用。
配置
您可以指定四个参数
group
- 序列参数内要计算的对象列表中的字段名称或字段名称(然后作为数组输入)- 默认值: ""
fieldName
- 模型中存储序列属性的字段名称- 默认值: "seq"
exceptions
- 如果您希望在上下文方法期间捕获异常,则设置此为true- 默认值: false
orderFrom1
- 如果您的列表从1开始而不是0,则设置此为true(用于移动方法)- 默认值: false
notUpdateOnDelete
- 如果您不想在删除对象时更新序列属性,则设置此为true- 默认值: false
disableTimestamps
- 如果您不想在序列方法中使用时更新"updated_at"属性,则将此设置为true- 默认值: false
用法
设置序列属性
序列属性将在模型创建时设置。
$section = Section::create([ 'article_id' => 1, 'title' => 'Lorem ipsum', ]);
在此方法之后,$section字段值将如下所示
{ 'id' => 1, 'article_id' => 1, 'title' => 'Lorem ipsum', 'seq' => 1 }
当我们创建另一个Section对象时
Section::create([ 'article_id' => 1, 'title' => 'Lorem ipsum Second', ]); Section::create([ 'article_id' => 2, 'title' => 'Lorem ipsum Third but new', ]);
我们得到具有以下字段的对象列表
[{ 'id' => 1, 'article_id' => 1, 'title' => 'Lorem ipsum', 'seq' => 1 }, { 'id' => 2, 'article_id' => 1, 'title' => 'Lorem ipsum Second', 'seq' => 2 }, { 'id' => 3, 'article_id' => 2, 'title' => 'Lorem ipsum Third but new', 'seq' => 1 }]
删除对象并更新序列
但是当我们删除对象时
Section::find(1)->delete();
序列值将相应更新
[{ 'id' => 2, 'article_id' => 1, 'title' => 'Lorem ipsum Second', 'seq' => 1 }, { 'id' => 3, 'article_id' => 2, 'title' => 'Lorem ipsum Third but new', 'seq' => 1 }]
获取具有适当序列的对象
要获取对象,只需添加->orderBy('seq', 'asc')
方法
Section::where('article_id', 1)->orderBy('seq', 'asc')->get();
或使用本地作用域sequenced
Section::where('article_id', 1)->sequenced()->get(); Section::where('article_id', 1)->sequenced('desc')->get();
将对象向上移动一个位置
要将对象向上移动一个位置(与较早的对象交换位置),您只需要
Section::find(2)->up();
这将设置序列属性为下一个位置,并且位置较低的对象的序列属性将更改为更远的位置。
配置中缩小的组将当然使用。
将对象向下移动一个位置
您同样可以将其用于使您的对象成为下一个对象
Section::find(2)->down();
这将设置Section ID=2的序列属性,类似于下一个Section对象(基于序列属性)并相应交换它们的值。
将对象移动到第一个位置
要将对象移动到第一个位置,您只需要
Section::find(2)->moveToFirst();
这将设置序列属性为序列中的第一个位置,并将相应地重新排序原始位置和第一个位置之间的对象。
配置中缩小的组将当然使用。
将对象移动到最后一个位置
要将对象移动到最后一个位置,您只需要
Section::find(2)->moveToLast();
这将设置序列属性为序列中的最后一个位置,并将相应地重新排序原始位置和最后一个位置之间的对象。
配置中缩小的组将当然使用。
将对象移动到任何位置
您还可以将对象移动到另一个位置。这在实现拖放功能时非常有用。
Section::find(2)->move(5);
这将设置Section ID=2,并带有序列属性为第5项,其余对象的序列属性将更新以匹配正确顺序。
刷新模型中的位置
有时您可能需要重新计算给定模型的所有位置(例如,因为手动操作数据集)。您可以通过以下方式轻松完成此操作:
Section::refreshSequence();
此静态方法将重新计算该模型每个记录的序列属性。将使用缩小组以及每个记录的当前序列属性。
检查对象是否在集合中是第一个
您可以检查对象是否在其组中是第一个。
Section::find(2)->isFirst();
这将返回true或false,表示此是否为集合中的第一个元素。
检查对象是否不在集合中是第一个
您可以检查对象是否不在其组中是第一个。
Section::find(2)->isNotFirst();
这将返回true或false,表示此是否不是集合中的第一个元素。
检查对象是否在集合中是最后一个
您可以检查对象是否在其组中是最后一个。
Section::find(2)->isLast();
这将返回true或false,表示此是否为集合中的最后一个元素。
检查对象是否不在集合中是最后一个
您可以检查对象是否不在其组中是最后一个。
Section::find(2)->isNotLast();
这将返回true或false,表示此是否不是集合中的最后一个元素。
测试
使用以下命令运行测试
vendor/bin/phpunit
更新日志
3.11.0
- Laravel 11支持
3.10.0
- Laravel 10支持
3.9.0
- Laravel 9支持
3.8.0
- Laravel 8支持
3.7.0
- Laravel 7支持
3.6.0
- 添加
isFirst
、isNotFirst
、isLast
、isNotLast
方法
3.5.0
- 针对3.3.0版本的修复 - 改进了在重新排序期间防止时间戳
3.4.0
- 支持Laravel 6.0版本
3.3.0
- 在重新排序期间防止更新
updated_at
时间戳的选项
3.2.0
- 修复
moveToLast
方法
3.1.0
- 更改现有对象的组(编号#16)的可能性
3.0.2
- 轻微的性能改进
3.0.0
- 支持所有Laravel 5.x版本
2.6.2
- 添加
NotUpdateOnDelete
配置参数
2.6.0
- Laravel 5.6支持
2.5.0
- Laravel 5.5支持
2.4.0
- Laravel 5.4支持
2.3.0
- Laravel 5.3支持
2.2.0
- Laravel 5.2支持
2.1.0
- Laravel 5.1支持
2.0.3
- 添加StyleCI和CircleCI支持
2.0.2
- 添加
moveToFirst
和moveToLast
方法
2.0.1
- 当位置参数小于
move
方法中第一个可能的序列值时,添加InvalidArgumentException
2.0.0
- 完整的单元测试
- 当位置参数大于
move
方法中最后一个可能的序列值时,添加InvalidArgumentException
- 带有无效位置参数的
move
方法(禁用异常参数)将序列属性设置为第一个可能的数字(计数+1),而不是从参数设置值 / 破坏性更改
1.3.1
- 修复在对象seq > 2时使用
down
方法的问题(1.3.0版本中引入的bug)
1.3.0
- 修复在对象seq > 2时使用
up
方法的问题
1.2.0
- 按需重新计算序列属性
1.1.1
- 为列表的起始索引进行配置(用于移动方法)
1.1.0
- 将对象移动到任何位置
1.0.0
- 添加up和down方法
0.9.0
- 创建包
- 创建用于自动处理序列属性处理的特性
鸣谢
此包由HighSolutions开发,该公司来自波兰,热爱Laravel。