1. Go to this page and download the library: Download spatie/eloquent-sortable library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
return [
/*
* The name of the column that will be used to sort models.
*/
'order_column_name' => 'order_column',
/*
* Define if the models should sort when creating. When true, the package
* will automatically assign the highest order number to a new model
*/
'sort_when_creating' => true,
/*
* Define if the timestamps should be ignored when sorting.
* When true, updated_at will not be updated when using setNewOrder
*/
'ignore_timestamps' => false,
];
use Spatie\EloquentSortable\Sortable;
use Spatie\EloquentSortable\SortableTrait;
class MyModel extends Model implements Sortable
{
use SortableTrait;
public $sortable = [
'order_column_name' => 'order_column',
'sort_when_creating' => true,
];
// ...
}
$myModel = new MyModel();
$myModel->save(); // order_column for this record will be set to 1
$myModel = new MyModel();
$myModel->save(); // order_column for this record will be set to 2
$myModel = new MyModel();
$myModel->save(); // order_column for this record will be set to 3
//the trait also provides the ordered query scope
$orderedRecords = MyModel::ordered()->get();
/**
* the record for model id 3 will have order_column value 1
* the record for model id 1 will have order_column value 2
* the record for model id 2 will have order_column value 3
*/
MyModel::setNewOrder([3,1,2]);
/**
* the record for model id 3 will have order_column value 11
* the record for model id 1 will have order_column value 12
* the record for model id 2 will have order_column value 13
*/
MyModel::setNewOrder([3,1,2], 10);
/**
* the record for model id 3 will have order_column value 11
* the record for model id 1 will have order_column value 12
* the record for model id 2 will have order_column value 13
*/
MyModel::setNewOrder([3,1,2], 10, null, function($query) {
$query->withoutGlobalScope(new ActiveScope);
});
/**
* the record for model uuid '7a051131-d387-4276-bfda-e7c376099715' will have order_column value 1
* the record for model uuid '40324562-c7ca-4c69-8018-aff81bff8c95' will have order_column value 2
* the record for model uuid '5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1' will have order_column value 3
*/
MyModel::setNewOrderByCustomColumn('uuid', [
'7a051131-d387-4276-bfda-e7c376099715',
'40324562-c7ca-4c69-8018-aff81bff8c95',
'5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1'
]);
/**
* the record for model uuid '7a051131-d387-4276-bfda-e7c376099715' will have order_column value 10
* the record for model uuid '40324562-c7ca-4c69-8018-aff81bff8c95' will have order_column value 11
* the record for model uuid '5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1' will have order_column value 12
*/
MyModel::setNewOrderByCustomColumn('uuid', [
'7a051131-d387-4276-bfda-e7c376099715',
'40324562-c7ca-4c69-8018-aff81bff8c95',
'5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1'
], 10);
// MyModel.php
public function buildSortQuery()
{
return static::query()->where('user_id', $this->user_id);
}
use Spatie\EloquentSortable\EloquentModelSortedEvent as SortEvent;
class SortingListener
{
public function handle(SortEvent $event): void {
if ($event->isFor(MyClass::class)) {
// ToDo: flush our cache
}
}
}