Skip to content

Сортировка ​

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.