silverd / laravel-sortable
Sortable behaviour for eloquent models
Requires
- php: ^7.4||^8.0
- illuminate/database: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
This package is auto-updated.
Last update: 2025-01-08 10:20:58 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\Sortable
interface. - 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.