LaravelPackages.net
Acme Inc.
Toggle sidebar
hippieua/laravel-sortable

Trait to sort order in Laravel model

135
1
1.0.1
About hippieua/laravel-sortable

hippieua/laravel-sortable is a Laravel package for trait to sort order in laravel model. It currently has 1 GitHub stars and 135 downloads on Packagist (latest version 1.0.1). Install it with composer require hippieua/laravel-sortable. Discover more Laravel packages by hippieua or browse all Laravel packages to compare alternatives.

Last updated

Laravel Sortable

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.

Star History Chart