From 71c4f56a9deb0dfc4d4da7cdaa9103ebcf289a7d Mon Sep 17 00:00:00 2001 From: Kyrch Date: Thu, 23 Apr 2026 22:43:53 -0300 Subject: [PATCH] feat(graphql): add support for sorting on search (#1190) --- app/GraphQL/Directives/SortDirective.php | 25 +++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/app/GraphQL/Directives/SortDirective.php b/app/GraphQL/Directives/SortDirective.php index cd81dff0f..9ba097fa1 100644 --- a/app/GraphQL/Directives/SortDirective.php +++ b/app/GraphQL/Directives/SortDirective.php @@ -6,15 +6,19 @@ namespace App\GraphQL\Directives; use App\Contracts\GraphQL\EnumSort; use App\Enums\Http\Api\Field\AggregateFunction; +use App\GraphQL\Sort\FieldSortCriteria; +use GraphQL\Error\Error; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Database\Query\Builder as QueryBuilder; +use Laravel\Scout\Builder as ScoutBuilder; use Nuwave\Lighthouse\Schema\Directives\BaseDirective; +use Nuwave\Lighthouse\Scout\ScoutBuilderDirective; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; use Nuwave\Lighthouse\Support\Contracts\ArgDirective; use UnitEnum; -class SortDirective extends BaseDirective implements ArgBuilderDirective, ArgDirective +class SortDirective extends BaseDirective implements ArgBuilderDirective, ArgDirective, ScoutBuilderDirective { public static function definition(): string { @@ -48,4 +52,23 @@ GRAPHQL; return $builder; } + + /** + * Modify the scout builder with a client given value. + * + * @param array $value the client given value of the argument + */ + public function handleScoutBuilder(ScoutBuilder $builder, mixed $value): ScoutBuilder + { + foreach ($value as $sort) { + $criteria = $sort->getSortCriteria(); + + match (true) { + $criteria instanceof FieldSortCriteria => $builder->orderBy($criteria->getColumn(), $criteria->getDirection()->value), + default => throw new Error('Sorting by this value is not supported when using the \'search\' parameter.'), + }; + } + + return $builder; + } }