pion/laravel-eloquent-position

带有最小设置的 Eloquent 模型位置逻辑

v1.1.3 2021-07-08 11:19 UTC

This package is auto-updated.

Last update: 2024-09-11 19:47:28 UTC


README

Total Downloads Latest Stable Version Latest Unstable Version

带有最小设置的 Eloquent 模型位置逻辑。在保存之前,它将检查位置是否已更改,并基于模型的位置值更新其他条目。

安装

在 Laravel 5.4 - 8 中进行了测试。

通过 composer 安装

composer require pion/laravel-eloquent-position

使用

  1. 在你的表(模型)中添加一个 position(可以是自定义的)列
  2. PositionTrait 添加到你的模型中(如果你使用的是自定义列,请设置 $positionColumn 属性)
  3. 如果你使用的是分组条目(如 parent_id 等),你可以使用列名/名称设置 $positionGroup(支持单个字符串或多个列)
  4. 添加到表单中的位置输入(可以是 input[type=number] 等)并在保存时填充/设置位置
  5. 当位置为 null 或空字符串时,将使用最后一个位置。
  6. 如果你没有使用迁移(列已存在),则运行 php artisan model:position` 命令以修复当前条目(它将创建正确的顺序)

然后你可以获取你的排序条目

// ASC
YourModel::sorted()->get()

// DESC
YourModel::sortedByDESC()->get()

如果使用默认列名(position),则值将转换为数值(如果非 null 或空字符串)。

获取位置 使用 $model->getPosition() 或使用列名 $model->position 的标准方式

迁移示例

public function up()
    {
    Schema::table('pages', function (Blueprint $table) {
        $table->smallInteger('position')->default(0)->after('id');
    });

    // Update the order pages
    Artisan::call('model:position', [
        'model'=> \App\Models\Page\Page::class
    ]);
}

模型示例

class Page extends Model
{
    use PositionTrait;

    public $table = 'pages';
    public $positionGroup = ['parent_slug'];

    protected $fillable = [
        'title', 'slug', 'parent_slug', 'content', 'description', 'position'
    ];
    
}

事件

你可以监听定位更改的事件。你可以使用 PositionEventsTrait 来轻松注册模型。

....

class YourModel extends Model {
    use PositionTrait, PositionEventsTrait;
    ....
}

定位

在运行最后的位置计算和给定位置的其他条目的最终移动之前调用。

可以执行以下操作

  • 将位置恢复到原始值 - 返回 false
  • 通过第二个参数($query->query() => Builder)中的 AbstractPositionQuery 对象添加额外的查询条件

名称:positioning

YourModel::positioning(function($model, $query) {
    $query->query()->where('type', 'type'); // or etc
    \Log::info('positioning', 'To '.$model->getPosition().' from '.$query->oldPosition());
});

定位的

名称:positioned

通过特质示例

YourModel::positioned(function($model) {
    /// TODO
});

命令

重新定位命令

此命令可以帮助你修复模型的位置顺序。你必须提供一个模型类。你必须将 RecalculatePositionCommand 包含到你的 Console Kernel 类中。

php artisan model:position App\\Models\\YourModel

特质

PositionTrait

使用 BasePositionTraitPositionScopeTrait

你可以设置

  • 字符串 positionColumn 以启用对位置列的重写
  • 布尔值 disablePositionUpdate 禁用其他条目的更新
  • 字符串|数组 positionGroup 从列中构建位置计算的过滤器。支持单个列或多列
  • 字符串 defaultPositionValue 当位置为空字符串或 null 时允许返回不同的值。默认值是 null

PositionScopeTrait

待办事项

  • 将自定义位置特质添加到启用自动转换为数值值(不希望使用 setAttribute 方法) - 进行中
  • 添加服务提供者以自动注册命令
  • 添加所有功能的所有文档
  • PositionScopeTrait 中添加 next/prev 范围函数
  • 添加 PositionHelperTrait 与 (getLastUsedPosition, getNextPosition($position = null))

贡献

有关如何贡献更改的说明,请参阅 CONTRIBUTING.md。所有贡献都受到欢迎。

版权和许可

laravel-eloquent-positionMartin Kluska 编写,并使用 MIT 许可协议 发布。

版权所有 (c) 2016 Martin Kluska