$value the client given value of the argument * @return QueryBuilder|EloquentBuilder|Relation the modified builder */ public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $value): QueryBuilder|EloquentBuilder|Relation { foreach ($value as $sort) { $criteria = $sort->getSortCriteria(); if ($criteria->aggregateRelation !== null) { match ($criteria->function) { AggregateFunction::EXISTS, AggregateFunction::COUNT => $builder->{"with{$criteria->function->value}"}($criteria->aggregateRelation), default => $builder->{"with{$criteria->function->value}"}($criteria->aggregateRelation, $criteria->getColumn()), }; } $criteria->sort($builder); } 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(); throw_if(Str::startsWith($criteria->__toString(), 'ID'), Error::class, 'Sorting by this value is not supported when using the \'search\' parameter.'); match (true) { $criteria instanceof FieldSortCriteria => $builder->orderBy($criteria->getColumn(), $criteria->getDirection()->value), $criteria instanceof RelationSortCriteria => $builder->orderBy($criteria->getRelation().'.'.$criteria->getColumn(), $criteria->getDirection()->value), default => throw new Error('Sorting by this value is not supported when using the \'search\' parameter.'), }; } return $builder; } }