$enumCases * * @throws ClientValidationException * @throws InvalidArgumentException */ public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $enumCases): QueryBuilder|EloquentBuilder|Relation { $sortByColumnInputArray = json_decode($this->directiveArgValue('columns'), true); foreach ($enumCases as $enumCase) { if ($enumCase === RandomSort::CASE) { $builder->inRandomOrder(); continue; } $direction = SortDirection::resolveFromEnumCase($enumCase); $sortByColumnValue = Str::remove('_DESC', $enumCase); $sortByColumnInput = Arr::first($sortByColumnInputArray, fn ($sortByColumn) => $sortByColumn[self::INPUT_VALUE] === $sortByColumnValue); $column = Arr::get($sortByColumnInput, self::INPUT_COLUMN); $sortType = SortType::from(Arr::get($sortByColumnInput, self::INPUT_SORT_TYPE)); if ($sortType === SortType::ROOT) { $builder->orderBy($column, $direction); } if ($sortType === SortType::AGGREGATE) { $relation = Arr::get($sortByColumnInput, self::INPUT_RELATION); if ($relation === null) { throw new InvalidArgumentException("The 'relation' argument is required for the @{$this->name()} directive with aggregate sort type."); } $builder->withAggregate([ "$relation as {$relation}_value" => function ($query) use ($direction) { $query->orderBy('value', $direction); }, ], 'value'); $builder->orderBy("{$relation}_value", $direction); } } return $builder; } }