silverd / laravel-sortable
Sortable behaviour for eloquent models
Installs: 85
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 142
pkg:composer/silverd/laravel-sortable
Requires
- php: ^7.4||^8.0
- illuminate/database: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0
- illuminate/support: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0
This package is auto-updated.
Last update: 2025-10-20 11:13:25 UTC
README
@thanks spatie/eloquent-sortable
Installation
This package can be installed through Composer.
composer require silverd/laravel-sortable:dev-master
Optionally you can publish the config file with:
php artisan vendor:publish --provider="Silverd\LaravelSortable\ServiceProvider"
Usage
To add sortable behaviour to your model you must:
- Implement the
Silverd\LaravelSortable\Sortableinterface. - Use the trait
Silverd\LaravelSortable\SortableTrait. - Optionally specify which column will be used as the order column. The default is
weight.
Example
use Silverd\LaravelSortable\Sortable; use Silverd\LaravelSortable\SortableTrait; class MyModel extends Eloquent implements Sortable { use SortableTrait; public $sortable = [ 'sort_column_name' => 'weight', 'sort_when_creating' => 'end', ]; ... }
If you don't set a value $sortable['sort_column_name'] the package will assume that your order column name will be named weight.
If you don't set a value $sortable['sort_when_creating'] the package will automatically assign the lowest order number to a new model;
Assuming that the db-table for MyModel is empty:
$myModel = new MyModel(); $myModel->save(); // weight for this record will be set to 1 $myModel = new MyModel(); $myModel->save(); // weight for this record will be set to 2 $myModel = new MyModel(); $myModel->save(); // weight for this record will be set to 3 //the trait also provides the ordered query scope $orderedRecords = MyModel::ordered()->get();
You can set a new order for all the records using the setNewOrder-method
/** * the record for model id 3 will have weight value 1 * the record for model id 1 will have weight value 2 * the record for model id 2 will have weight value 3 */ MyModel::setNewOrder([3,1,2]);
Optionally you can pass the starting order number as the second argument.
/** * the record for model id 3 will have weight value 11 * the record for model id 1 will have weight value 12 * the record for model id 2 will have weight value 13 */ MyModel::setNewOrder([3,1,2], 10);
To sort using a column other than the primary key, use the setNewOrderByCustomColumn-method.
/** * the record for model uuid '7a051131-d387-4276-bfda-e7c376099715' will have weight value 1 * the record for model uuid '40324562-c7ca-4c69-8018-aff81bff8c95' will have weight value 2 * the record for model uuid '5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1' will have weight value 3 */ MyModel::setNewOrderByCustomColumn('uuid', [ '7a051131-d387-4276-bfda-e7c376099715', '40324562-c7ca-4c69-8018-aff81bff8c95', '5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1' ]);
As with setNewOrder, setNewOrderByCustomColumn will also accept an optional starting order argument.
/** * the record for model uuid '7a051131-d387-4276-bfda-e7c376099715' will have weight value 10 * the record for model uuid '40324562-c7ca-4c69-8018-aff81bff8c95' will have weight value 11 * the record for model uuid '5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1' will have weight value 12 */ MyModel::setNewOrderByCustomColumn('uuid', [ '7a051131-d387-4276-bfda-e7c376099715', '40324562-c7ca-4c69-8018-aff81bff8c95', '5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1' ], 10);
You can also move a model up or down with these methods:
$myModel->moveOrderDown(); $myModel->moveOrderUp();
You can also move a model to the first or last position:
$myModel->moveToStart(); $myModel->moveToEnd();
You can swap the order of two models:
MyModel::swapOrder($myModel, $anotherModel);
License
The MIT License (MIT). Please see License File for more information.