highsolutions/eloquent-sequence

一个用于简化Eloquent模型序列支持创建和管理的Laravel包,支持弹性配置。

3.11.0 2024-04-22 09:42 UTC

README

License: MIT

通过弹性配置简化Eloquent模型序列支持创建和管理。

Eloquent-Sequence by HighSolutions

安装

此包可以通过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

  • 添加isFirstisNotFirstisLastisNotLast方法

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

  • 添加moveToFirstmoveToLast方法

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。