filter($builder, $args, $type); $this->sort($builder, $args, $type); $this->constrainEagerLoads($builder, $resolveInfo, $type); return $this->paginate($builder, $args); } public function search(Builder $builder, array $args, BaseType $type, ResolveInfo $resolveInfo): Paginator { $criteria = new Criteria(Arr::get($args, 'search')); $searchBuilder = Search::search($builder->getModel(), $criteria) ->passToEloquentBuilder(function (Builder $builder) use ($args, $type, $resolveInfo): void { $this->filter($builder, $args, $type); $this->sort($builder, $args, $type); $this->constrainEagerLoads($builder, $resolveInfo, $type); }); $first = min(100, Arr::get($args, 'first')); $page = Arr::get($args, 'page', 1); $maxCount = Config::get('graphql.pagination_values.max_count'); throw_if($maxCount !== null && $first > $maxCount, ClientValidationException::class, "Maximum first value is {$maxCount}. Got {$first}. Fetch in smaller chuncks."); $searchBuilder->withPagination($first, $page); $sorts = Arr::get($args, SortArgument::ARGUMENT, []); $criteria = Arr::get(new SortableColumns($type)->getAttributes(), 'criteria'); $sortsRaw = []; foreach ($sorts as $sort) { /** @var SortCriteria $criterion */ $criterion = Arr::get($criteria, $sort); $column = $criterion->getField()->getColumn(); $direction = $criterion->getDirection(); $sortType = $criterion->getField()->sortType(); $isString = $criterion->getField() instanceof StringField; if ($sortType === SortType::ROOT) { $sortsRaw[$column] = [ 'direction' => $direction, 'isString' => $isString, ]; } if ($criterion instanceof RelationSortCriteria) { $sortsRaw[$column] = [ 'direction' => $direction->value, 'isString' => $isString, 'relation' => $criterion->relation, ]; } } $searchBuilder->withSort($sortsRaw); return $searchBuilder->execute(); } }