hippieua / laravel-sortable
Trait to sort order in Laravel model
Requires
- php: >=7.3
README
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.