Этот пакет предоставляет особенность, которая добавляет поведение сортировки в модель Eloquent.
Значение столбца заказа новой записи модели определяется максимальным значением столбца заказа всех записей этой модели + 1.
Пакет также предоставляет область запроса для получения всех записей в правильном порядке.
Spatie — агентство веб-дизайна в Антверпене, Бельгия. На нашем сайте вы найдете обзор всех наших проектов с открытым исходным кодом.
Узнайте, как создать подобную упаковку, посмотрев наш премиум-видеокурс:
Мы вкладываем много ресурсов в создание лучших в своем классе пакетов с открытым исходным кодом. Вы можете поддержать нас, купив один из наших платных продуктов.
Мы очень признательны вам за отправку нам открытки из вашего родного города с указанием того, какой из наших пакетов вы используете. Наш адрес вы найдете на странице контактов. Все полученные открытки мы публикуем на нашей виртуальной стене открыток.
Для Laravel 6.x или PHP 7.x используйте версию 3.x этого пакета.
Этот пакет можно установить через Composer.
composer require spatie/eloquent-sortable
В Laravel 5.5 и выше поставщик услуг автоматически зарегистрируется. В более старых версиях платформы просто добавьте поставщика услуг в файл config/app.php
:
' providers ' => [
...
Spatie EloquentSortable EloquentSortableServiceProvider::class,
];
При желании вы можете опубликовать файл конфигурации с помощью:
php artisan vendor:publish --tag=eloquent-sortable-config
Это содержимое файла, который будет опубликован в config/eloquent-sortable.php
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 ,
];
Чтобы добавить сортируемое поведение в вашу модель, вам необходимо:
SpatieEloquentSortableSortable
.SpatieEloquentSortableSortableTrait
.order_column
. 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 ,
];
// ...
}
Если вы не установили значение $sortable['order_column_name']
пакет предположит, что имя столбца вашего заказа будет называться order_column
.
Если вы не установили значение $sortable['sort_when_creating']
пакет автоматически присвоит новой модели наивысший порядковый номер;
Предполагая, что таблица БД для MyModel
пуста:
$ 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 ();
Вы можете установить новый порядок для всех записей, используя метод setNewOrder
/**
* 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 );
});
Для сортировки по столбцу, отличному от первичного ключа, используйте метод setNewOrderByCustomColumn
.
/**
* 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 '
]);
Как и в случае с setNewOrder
, setNewOrderByCustomColumn
также принимает необязательный аргумент начального порядка.
/**
* 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 -> moveOrderDown ();
$ myModel -> moveOrderUp ();
Вы также можете переместить модель на первую или последнюю позицию:
$ myModel -> moveToStart ();
$ myModel -> moveToEnd ();
Вы можете определить, является ли элемент первым или последним по порядку:
$ myModel -> isFirstInOrder ();
$ myModel -> isLastInOrder ();
Вы можете поменять порядок двух моделей:
MyModel:: swapOrder ( $ myModel , $ anotherModel );
Если ваша модель/таблица имеет поле группировки (обычно внешний ключ): id,
user_id
, title, order_column
и вы хотите, чтобы приведенные выше методы учитывали это, вы можете создать метод buildSortQuery
в своей модели:
// MyModel.php
public function buildSortQuery ()
{
return static :: query ()-> where ( ' user_id ' , $ this -> user_id );
}
Это ограничит вычисления значениями полей экземпляра модели.
После завершения сортировки отправляется событие ( SpatieEloquentSortableEloquentModelSortedEvent
), которое вы можете прослушать. Это может быть полезно для запуска логики пост-сортировки, например очистки кешей или других действий, которые необходимо выполнить после сортировки.
У события есть помощник isFor
, который позволяет вам удобно проверять отсортированный класс Eloquent.
Ниже приведен пример того, как вы можете прослушивать это событие:
use Spatie EloquentSortable EloquentModelSortedEvent as SortEvent ;
class SortingListener
{
public function handle ( SortEvent $ event ): void {
if ( $ event -> isFor (MyClass::class)) {
// ToDo: flush our cache
}
}
}
Пакет содержит несколько интеграционных/дымовых тестов, настроенных с помощью Orchestra. Тесты можно запускать через phpunit.
vendor/bin/phpunit
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Пожалуйста, ознакомьтесь с нашей политикой безопасности, чтобы узнать, как сообщать об уязвимостях безопасности.
Лицензия MIT (MIT). Дополнительную информацию см. в файле лицензии.