alvits/laravel-eloquent-position

使用最少设置进行Eloquent模型位置逻辑

v1.0.5 2019-01-07 18:51 UTC

This package is auto-updated.

Last update: 2024-09-17 18:21:36 UTC


README

使用最少设置进行Eloquent模型位置逻辑。在保存之前,它会检查位置是否已更改,并根据模型的位置值更新其他条目。

Total Downloads Latest Stable Version Latest Unstable Version

安装

使用composer安装

composer require alvits/laravel-eloquent-position

用法

  1. 在您的表(模型)中添加一个position(可以是自定义的)列
  2. PositionTrait添加到您的模型中(如果您正在使用自定义列,请设置$positionColumn属性)
  3. 如果您正在使用分组条目(如parent_id等),您可以设置$positionGroup为列名/名称(支持单个字符串或多个列)
  4. 添加到表单中位置输入(可以是input[type=number]等)并在保存时填充/设置位置
  5. 当位置为null或空字符串时,将使用最后一个位置。
  6. 如果您没有使用迁移(该列已存在),则运行php artisian 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)添加额外的查询条件

名称: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包含到您的控制台Kernel类中。

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

特性

PositionTrait

使用BasePositionTraitPositionScopeTrait

您可以设置

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

PositionScopeTrait

待办事项

  • 添加自定义位置特性以启用自动转换为数值值(不希望使用setAttribute方法) - 进度中
  • 添加服务提供商以自动注册命令
  • 添加所有功能的所有文档
  • PositionScopeTrait中添加下一个/上一个作用域函数
  • 添加PositionHelperTrait带有(getLastUsedPosition,getNextPosition($position = null))

贡献

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

版权和许可证

laravel-eloquent-position 是由 Martin Kluska 编写的,并采用 MIT 许可协议 发布。

版权所有 © 2016 Martin Kluska