pion / laravel-eloquent-position
带有最小设置的 Eloquent 模型位置逻辑
v1.1.3
2021-07-08 11:19 UTC
Requires
- laravel/framework: >=5.5
Requires (Dev)
- orchestra/testbench: ~3.6.7 || ~3.7.8 || ~3.8.6 || ^4.8 || ^5.2 || ^6.0
- squizlabs/php_codesniffer: 2.*
README
带有最小设置的 Eloquent 模型位置逻辑。在保存之前,它将检查位置是否已更改,并基于模型的位置值更新其他条目。
安装
在 Laravel 5.4 - 8 中进行了测试。
通过 composer 安装
composer require pion/laravel-eloquent-position
使用
- 在你的表(模型)中添加一个
position
(可以是自定义的)列 - 将
PositionTrait
添加到你的模型中(如果你使用的是自定义列,请设置$positionColumn
属性) - 如果你使用的是分组条目(如 parent_id 等),你可以使用列名/名称设置
$positionGroup
(支持单个字符串或多个列) - 添加到表单中的位置输入(可以是 input[type=number] 等)并在保存时填充/设置位置
- 当位置为 null 或空字符串时,将使用最后一个位置。
- 如果你没有使用迁移(列已存在),则运行 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
使用 BasePositionTrait
和 PositionScopeTrait
你可以设置
- 字符串
positionColumn
以启用对位置列的重写 - 布尔值
disablePositionUpdate
禁用其他条目的更新 - 字符串|数组
positionGroup
从列中构建位置计算的过滤器。支持单个列或多列 - 字符串
defaultPositionValue
当位置为空字符串或 null 时允许返回不同的值。默认值是 null
PositionScopeTrait
待办事项
- 将自定义位置特质添加到启用自动转换为数值值(不希望使用 setAttribute 方法) - 进行中
- 添加服务提供者以自动注册命令
- 添加所有功能的所有文档
- 在
PositionScopeTrait
中添加 next/prev 范围函数 - 添加
PositionHelperTrait
与 (getLastUsedPosition, getNextPosition($position = null))
贡献
有关如何贡献更改的说明,请参阅 CONTRIBUTING.md。所有贡献都受到欢迎。
版权和许可
laravel-eloquent-position 由 Martin Kluska 编写,并使用 MIT 许可协议 发布。
版权所有 (c) 2016 Martin Kluska