mtsanford / laravel-arrangeable
为Laravel eloquent模型提供可排序行为
v0.3.2
2018-09-03 21:07 UTC
Requires
- php: >=7.0
- illuminate/database: ~5.5.0|~5.6.0
- illuminate/support: ~5.5.0|~5.6.0
Requires (Dev)
- orchestra/testbench: ~3.5.0|~3.6.0
- phpunit/phpunit: ^6.2|^7.0
README
此包提供了一个特质,它将为Laravel模型添加可排序行为。可排序模型的实例具有顺序列,其值为0,1,2... 默认情况下,可排序模型不使用外键进行分组,但可以在配置中指定外键,每个组将有自己的排序。兼容Lavavel ^5.5。
安装
您可以使用composer安装
composer require mtsanford/laravel-arrangeable
用法
要将可排序行为添加到您的模型中,请使用特质MTSanford\LaravelArrangeable\ArrangeableTrait,可选地在配置中指定外键以分组模型。
use MTSanford\LaravelArrangeable\ArrangeableTrait; class MyModel extends Model { use ArrangeableTrait; public $arrangeableConfig = [ 'foreign_key' => 'foreign_id', ]; }
方法
ArrangeableTrait::arrangeableMove(array, int | null)
这将根据指定的ID将一系列模型移动到由外键定义的目标组中,并将其附加到目标组的末尾,按指定顺序排列。目标组中的模型可以包含在源列表中。移除项的组将适当地调整其顺序。
// Move models 4, 5, and 2 to the end of the group with foreign key = 1 MyModel::arrangeableMove([4,5,2],1); // | id | foreign_id | order | | id | foreign_id | order | // | -- | ---------- | ----- | | -- | ---------- | ----- | // | 1 | 1 | 0 | BECOMES | 1 | 1 | 0 | // | 2 | 1 | 1 | =========> | 2 | 1 | 4 | // | 3 | 1 | 2 | | 3 | 1 | 1 | // | 4 | 2 | 0 | | 4 | 1 | 2 | // | 5 | 2 | 1 | | 5 | 1 | 3 | // | 6 | 2 | 2 | | 6 | 2 | 0 |
如果所有模型都在同一个外键组中并且将保持在那里,则不需要指定它。重新排序整个组只是这个的特殊情况。
// reverse the order of the models with foreign key = 2 MyModel::arrangeableMove([6,5,4]); // | id | foreign_id | order | | id | foreign_id | order | // | -- | ---------- | ----- | | -- | ---------- | ----- | // | 1 | 1 | 0 | BECOMES | 1 | 1 | 0 | // | 2 | 1 | 1 | =========> | 2 | 1 | 1 | // | 3 | 1 | 2 | | 3 | 1 | 2 | // | 4 | 2 | 0 | | 4 | 2 | 2 | // | 5 | 2 | 1 | | 5 | 2 | 1 | // | 6 | 2 | 2 | | 6 | 2 | 0 |
另外,如果模型没有外键,则不需要指定它。
// Move models 2 and 1 to the end of the arrangement group MyModel::arrangeableMove([2,1]); // | id | order | | id | order | // | -- | ----- | | -- | ----- | // | 1 | 0 | BECOMES | 1 | 3 | // | 2 | 1 | =========> | 2 | 2 | // | 3 | 2 | | 3 | 0 | // | 4 | 3 | | 4 | 1 |
ArrangeableTrait::arrangeableFixOrder(int | null)
这是一个方便的实用工具,如果您的工作导致排序变得不规则。同样,如果已在$ arrangeableConfig中指定了外键(见下文),则需要外键参数。
MyModel::arrangeableFixOrder(1); // | id | foreign_id | order | | id | foreign_id | order | // | -- | ---------- | ----- | | -- | ---------- | ----- | // | 1 | 1 | 0 | BECOMES | 1 | 1 | 0 | // | 2 | 1 | 5 | =========> | 2 | 1 | 1 | // | 3 | 1 | 8 | | 3 | 1 | 2 | // | 4 | 2 | 0 | | 4 | 2 | 0 |
创建和删除
默认情况下,监听'创建'和'deleted'模型事件,并保持组内顺序的最新状态。
new MyModel(['foreign_id' => 1]); // | id | foreign_id | order | | id | foreign_id | order | // | -- | ---------- | ----- | | -- | ---------- | ----- | // | 1 | 1 | 0 | BECOMES | 1 | 1 | 0 | // | 2 | 1 | 1 | =========> | 2 | 1 | 1 | // | 3 | 1 | 2 | | 3 | 1 | 2 | // | 4 | 1 | 3 | MyModel::find(2)->delete(); // | id | foreign_id | order | | id | foreign_id | order | // | -- | ---------- | ----- | | -- | ---------- | ----- | // | 1 | 1 | 0 | BECOMES | 1 | 1 | 0 | // | 2 | 1 | 1 | =========> | 3 | 1 | 1 | // | 3 | 1 | 2 |
排序查询作用域
MyModel::arrange()->get()->pluck('id')->all(); // | id | order | // | -- | ----- | // | 1 | 0 | // | 2 | 1 | =======> [1,2,4,3] // | 3 | 3 | // | 4 | 2 |
配置
这些是默认配置设置
protected static $arrangeableConfigDefaults = [ 'primary_key' => 'id', 'order_key' => 'order', 'foreign_key' => NULL, 'start_order' => 0, 'handle_create' => true, 'handle_delete' => true, ]; // primary_key: primary key of the model // order_key: the column in the model that holds the order // foreign_key: order will be maintained with models that have same foreign key // or in the entire table if NULL. // start_order value of order_key for the start of the list // handle_create automatically set order_key on new models to end of list? // handle_delete automatically maintain order when a model is removed?
要覆盖其中任何一个,请在您的模型中定义静态属性$arrangeableConfig。
class MyModel extends Model { use ArrangeableTrait; public static $arrangeableConfig = [ 'foreign_key' => 'parent_id', 'start_order' => 1, ]; }
测试
该包包含一些phpunit测试,使用Orchestra。安装后运行
$ vendor/bin/phpunit
鸣谢
关于
Mark Sanford是一位旧金山的开发者。
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。