To register a sort option use the sort
method.
protected function configure(): void
{
...
$this->sort('name');
...
}
The sort will be performed by applying an orderBy
on a column with the same name.
{info} A request which tries to apply a sort which is not configured results in a
422
error response.
When you want to add a custom sort option to your Jory API you can pass a callback or SortScope class as a second parameter. A SortScope class must implement the JosKolenberg\LaravelJory\Scopes\SortScope
interface.
MusicianJoryResource.php
protected function configure(): void
{
...
$this->sort('band_name', function ($builder, string $order = 'asc'){
$builder->join('bands', 'band_id', 'bands.id')->orderBy('bands.name', $order);
});
...
}
{info} Sort callbacks are available since version 3.2.0
Or equal functionality using a SortScope class:
BandNameSort.php
use JosKolenberg\LaravelJory\Scopes\SortScope;
class BandNameSort implements SortScope
{
public function apply($builder, string $order = 'asc'): void
{
$builder->join('bands', 'band_id', 'bands.id')->orderBy('bands.name', $order);
}
}
MusicianJoryResource.php
protected function configure(): void
{
...
$this->sort('band_name', new BandNameSort);
...
}
Use the default
option to apply a sort on every query. When using multiple default sorts, use the index
parameter to define in which order the sorts must be applied.
Any sort options in the request will always take precedence over the default ones.
protected function configure(): void
{
...
$this->sort('first_name')->default(2);
$this->sort('last_name')->default(1, 'desc');
$this->sort('title');
...
}
The following request will fetch musicians sorted by 1. title asc
, 2. last_name desc
and 3. first_name asc
.
axios.get('jory/musician', {
params: {
jory: {
sorts: ['title']
}
}
});
If you want to register a field and a sort option on the same column in one go use the sortable
helper method when configuring a field.
protected function configure(): void
{
...
$this->field('name')->sortable();
...
}
A callback can be added to set additional options.
protected function configure(): void
{
...
$this->field('name')->sortable(function ($sort){
$sort->scope(new CustomNameSort);
$sort->default();
});
...
}