Сортировка
allowedSorts() перечисляет сортировки, которые может использовать запрос клиента. Параметр sort принимает список имён; - в начале сортирует по убыванию:
php
QueryBuilder::for(User::class)
->allowedSorts('name', 'created_at')
->get();GET /users?sort=-created_at,nameСортировка не из списка выбрасывает InvalidSortQuery. Сортировки применяются в порядке запроса клиента.
Другое имя колонки
php
use MyProgs\QueryBuilder\AllowedSort;
AllowedSort::field('created', 'created_at')Клиент сортирует по created, запрос — по created_at.
Сортировка по умолчанию
php
QueryBuilder::for(User::class)
->allowedSorts('name', 'created_at')
->defaultSort('-created_at')
->get();Сортировка по умолчанию применяется, когда в запросе клиента нет sort. defaultSort() и defaultSorts() принимают несколько имён, а также объекты AllowedSort:
php
use MyProgs\QueryBuilder\Enums\SortDirection;
->defaultSort(AllowedSort::field('created', 'created_at')->defaultDirection(SortDirection::Descending))Сортировки-callback
php
AllowedSort::callback('posts', function (Builder $query, bool $descending, string $property) {
$query->withCount('posts')->orderBy('posts_count', $descending ? 'desc' : 'asc');
})Собственные классы сортировок
Реализуйте MyProgs\QueryBuilder\Sorts\Sort и зарегистрируйте его через custom():
php
use Illuminate\Database\Eloquent\Builder;
use MyProgs\QueryBuilder\Sorts\Sort;
class StringLengthSort implements Sort
{
public function __invoke(Builder $query, bool $descending, string $property): void
{
$query->orderByRaw("LENGTH(`{$property}`) ".($descending ? 'DESC' : 'ASC'));
}
}php
AllowedSort::custom('name-length', new StringLengthSort, 'name')Третий аргумент — свойство, передаваемое классу, здесь это name.