hippieua/laravel-sortable

Trait to sort order in Laravel model

1.0.1 2022-07-04 08:45 UTC

This package is auto-updated.

Last update: 2024-11-09 01:39:32 UTC


README

Latest Version on Packagist Total Downloads

This package allows you to sort order of your Laravel model records with easy methods:

$model->moveUp();
$model->moveDown();
$model->move('up');
$model->move('down');

Installation

To install the most recent version, run the following command.

composer require hippieua/laravel-sortable

Setup

Your model should contain sortable field. You can add new or use existing one (don't use default id field)

Schema::table('comments', function (Blueprint $table) {
    $table->unsignedInteger('order')->default(1);
});

Update you model, use Sortable trait and fill $sortable_field property according to field name you've added.

    use Hippie\Sortable\Sortable;
    
    class Comment extends Model
    {
        use Sortable;
        
        protected string $sortable_field = 'order';
        
        protected $fillable = [
            'order',
        ];
    }

If your model have BelongsTo relationship, and you want to move records up and down within your relation items fill $sortable_relation property.

use Hippie\Sortable\Sortable;

class Comment extends Model
{
    use Sortable;
    
    protected string $sortable_field = 'order';
    protected string $sortable_relation = 'post';
    
    protected $fillable = [
        'order',
    ];
    
    public function post(): BelongsTo
    {
        return $this->belongsTo(Post::class);
    }
class Post extends Model
{
    public function comments(): BelongsTo
    {
        return $this->hasMany(Comment::class)->orderBy('order'); 
    }    
}

In case you don't want to calculate your sortable field value on creating new item manually add static::created to your sortable model

protected static function booted()
{
    static::created(function ($model) {
        $model->updateSortOrderOnCreate();
    });
}

Usage

Add new item

$comment = $post->comments()->create([
    'text' => $request->text,
])

$comment->order value will be set to $post->comments->count() + 1

Sort existing items

$post->comments()->first()->moveDown()

will set order field value for the first comment to 2 and set order field value for second item to 1;

Available methods

$comment->moveUp();
$comment->moveDown();
$comment->move('up');
$comment->move('down');

Info

Tested on Laravel 8 and 9 versions

Credits

License

The MIT License (MIT). Please see License File for more information.