thadbryson/eloquent-sequence

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

3.6.0 2019-10-06 11:05 UTC

README

CircleCI StyleCI License: MIT

使用弹性配置简化Eloquent模型的序列创建和管理。

Eloquent-Sequence by HighSolutions

安装

此包可以通过Composer安装

composer require highsolutions/eloquent-sequence

或者通过将以下行添加到您的Laravel webapp的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 - 如果您想在up/down方法期间捕获异常,则设置此为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();

这将返回一个布尔值,表示该对象是否是集合中的第一个元素。

检查对象不是集合中的第一个

您能够检查对象是否不是其组中的第一个。

Section::find(2)->isNotFirst();

这将返回一个布尔值,表示该对象不是集合中的第一个元素。

检查对象是否是集合中的最后一个

您能够检查对象是否是其组中的最后一个。

Section::find(2)->isLast();

这将返回一个布尔值,表示该对象是否是集合中的最后一个元素。

检查对象不是集合中的最后一个

您能够检查对象是否不是其组中的最后一个。

Section::find(2)->isNotLast();

这将返回一个布尔值,表示该对象不是集合中的最后一个元素。

测试

使用以下命令运行测试

vendor/bin/phpunit

变更日志

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 版本中引入的错误)

1.3.0

  • 修复在对象 seq > 2 时使用的 up 方法

1.2.0

  • 按需重新计算序列属性

1.1.1

  • 配置列表的起始索引(用于移动方法)

1.1.0

  • 将对象移动到任何位置

1.0.0

  • 添加上移和下移方法

0.9.0

  • 创建软件包
  • 创建用于自动处理序列属性的特质

鸣谢

此软件包由 HighSolutions 开发,这是一家来自波兰的软件公司,热爱 Laravel。