mtsanford/laravel-arrangeable

为Laravel eloquent模型提供可排序行为

v0.3.2 2018-09-03 21:07 UTC

This package is auto-updated.

Last update: 2024-09-22 10:49:26 UTC


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

鸣谢

spatie/eloquent-sortable启发。

关于

Mark Sanford是一位旧金山的开发者。

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件