alvits / laravel-eloquent-position
使用最少设置进行Eloquent模型位置逻辑
v1.0.5
2019-01-07 18:51 UTC
Requires
- laravel/framework: 5.1.* || 5.2.* || 5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.*
Requires (Dev)
README
使用最少设置进行Eloquent模型位置逻辑。在保存之前,它会检查位置是否已更改,并根据模型的位置值更新其他条目。
安装
使用composer安装
composer require alvits/laravel-eloquent-position
用法
- 在您的表(模型)中添加一个
position
(可以是自定义的)列 - 将
PositionTrait
添加到您的模型中(如果您正在使用自定义列,请设置$positionColumn
属性) - 如果您正在使用分组条目(如parent_id等),您可以设置
$positionGroup
为列名/名称(支持单个字符串或多个列) - 添加到表单中位置输入(可以是input[type=number]等)并在保存时填充/设置位置
- 当位置为null或空字符串时,将使用最后一个位置。
- 如果您没有使用迁移(该列已存在),则运行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
使用BasePositionTrait
和PositionScopeTrait
您可以设置
- 字符串
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