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
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');
To install the most recent version, run the following command.
composer require hippieua/laravel-sortable
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();
});
}
$comment = $post->comments()->create([
'text' => $request->text,
])
$comment->order value will be set to $post->comments->count() + 1
$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;
$comment->moveUp();
$comment->moveDown();
$comment->move('up');
$comment->move('down');
Tested on Laravel 8 and 9 versions
The MIT License (MIT). Please see License File for more information.