diff --git a/CHANGELOG.md b/CHANGELOG.md index 20c6ba9f7e..d76df10510 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,11 @@ You can find and compare releases at the [GitHub release page](https://github.co ## Unreleased +### Changed + +- Use common Builder interface https://github.com/nuwave/lighthouse/pull/2389 +- Do not pass `ResolveInfo` to itself in `ResolveInfo::enhanceBuilder()` https://github.com/nuwave/lighthouse/pull/2389 + ## v6.9.1 ### Fixed diff --git a/UPGRADE.md b/UPGRADE.md index 840c4ce029..945551b918 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -24,6 +24,36 @@ It will prevent the following type of HTTP requests: - `GET` requests - `POST` requests that can be created using HTML forms +### Type hinting query builders + +Lighthouse now uses `Illuminate\Contracts\Database\Query\Builder` to type hint database query builders. +If you implement `ArgBuilderDirective` or `FieldBuilderDirective`, you will have to change the signature of the `handleFieldBuilder` method accordingly: + +```diff +- use Illuminate\Database\Eloquent\Builder as EloquentBuilder; +- use Illuminate\Database\Eloquent\Relations\Relation; +- use Illuminate\Database\Query\Builder as QueryBuilder; ++ use Illuminate\Contracts\Database\Query\Builder; + +- public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation; ++ public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder; +``` + +### Do not pass `ResolveInfo` to itself in `ResolveInfo::enhanceBuilder()` + +`ResolveInfo::enhanceBuilder()` no longer expects to be passed an instance of `ResolveInfo`, +as it can access it via `$this`. + +```diff +use Nuwave\Lighthouse\Execution\ResolveInfo; +use Nuwave\Lighthouse\Support\Contracts\GraphQLContext; + +// Some resolver function or directive middleware +function (mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) { +- $resolveInfo->enhanceBuilder($builder, $scopes, $root, $args, $context, $resolveInfo, $directiveFilter); ++ $resolveInfo->enhanceBuilder($builder, $scopes, $root, $args, $context, $directiveFilter); +``` + ## v5 to v6 ### `messages` on `@rules` and `@rulesForArray` diff --git a/docs/master/custom-directives/argument-directives.md b/docs/master/custom-directives/argument-directives.md index fd4179ce71..07ad8ddb28 100644 --- a/docs/master/custom-directives/argument-directives.md +++ b/docs/master/custom-directives/argument-directives.md @@ -145,9 +145,7 @@ where the `category` column is equal to the value of the `category` argument. So let's take a look at a simplified version of the built-in [@eq](../api-reference/directives.md#eq) directive. ```php -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; class EqDirective extends BaseDirective implements ArgBuilderDirective @@ -171,7 +169,7 @@ GRAPHQL; /** * Apply a "WHERE = $value" clause. */ - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { return $builder->where( $this->directiveArgValue('key', $this->nodeName()), diff --git a/src/Auth/CanDirective.php b/src/Auth/CanDirective.php index ec5f0f9b2d..b2dcad28bc 100644 --- a/src/Auth/CanDirective.php +++ b/src/Auth/CanDirective.php @@ -157,7 +157,6 @@ protected function modelsToCheck(mixed $root, array $args, GraphQLContext $conte $root, $args, $context, - $resolveInfo, ) ->get(); } @@ -194,7 +193,6 @@ protected function modelsToCheck(mixed $root, array $args, GraphQLContext $conte $root, $args, $context, - $resolveInfo, Utils::instanceofMatcher(TrashedDirective::class), ); assert($enhancedBuilder instanceof EloquentBuilder); diff --git a/src/Auth/WhereAuthDirective.php b/src/Auth/WhereAuthDirective.php index 0e645d82f5..ffdf98d62d 100644 --- a/src/Auth/WhereAuthDirective.php +++ b/src/Auth/WhereAuthDirective.php @@ -3,9 +3,8 @@ namespace Nuwave\Lighthouse\Auth; use Illuminate\Contracts\Auth\Factory as AuthFactory; +use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Schema\Directives\BaseDirective; use Nuwave\Lighthouse\Support\Contracts\FieldBuilderDirective; @@ -38,7 +37,7 @@ public static function definition(): string GRAPHQL; } - public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation + public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder { assert($builder instanceof EloquentBuilder); diff --git a/src/Execution/ResolveInfo.php b/src/Execution/ResolveInfo.php index ce42d5b73e..fdb29cc9ec 100644 --- a/src/Execution/ResolveInfo.php +++ b/src/Execution/ResolveInfo.php @@ -3,9 +3,7 @@ namespace Nuwave\Lighthouse\Execution; use GraphQL\Type\Definition\ResolveInfo as BaseResolveInfo; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Support\Collection; use Laravel\Scout\Builder as ScoutBuilder; use Nuwave\Lighthouse\Execution\Arguments\ArgumentSet; @@ -37,26 +35,21 @@ public function __construct( /** * Apply ArgBuilderDirectives and scopes to the builder. * - * @template TModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Relations\Relation|\Laravel\Scout\Builder $builder * @param array $scopes * @param array $args * @param (callable(\Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective): bool)|null $directiveFilter * - * @return \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Relations\Relation|\Laravel\Scout\Builder + * @api */ - public function enhanceBuilder(QueryBuilder|EloquentBuilder|Relation|ScoutBuilder $builder, array $scopes, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo, callable $directiveFilter = null): QueryBuilder|EloquentBuilder|Relation|ScoutBuilder + public function enhanceBuilder(Builder|ScoutBuilder $builder, array $scopes, mixed $root, array $args, GraphQLContext $context, callable $directiveFilter = null): Builder|ScoutBuilder { - $argumentSet = $resolveInfo->argumentSet; - - $scoutEnhancer = new ScoutEnhancer($argumentSet, $builder); + $scoutEnhancer = new ScoutEnhancer($this->argumentSet, $builder); if ($scoutEnhancer->canEnhanceBuilder()) { return $scoutEnhancer->enhanceBuilder(); } - self::applyArgBuilderDirectives($argumentSet, $builder, $directiveFilter); - self::applyFieldBuilderDirectives($builder, $root, $args, $context, $resolveInfo); + self::applyArgBuilderDirectives($this->argumentSet, $builder, $directiveFilter); + self::applyFieldBuilderDirectives($builder, $root, $args, $context, $this); foreach ($scopes as $scope) { $builder->{$scope}($args); @@ -72,24 +65,24 @@ public function enhanceBuilder(QueryBuilder|EloquentBuilder|Relation|ScoutBuilde * @param array $scopes * @param array $args * @param (callable(\Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective): bool)|null $directiveFilter + * + * @api */ - public function wouldEnhanceBuilder(QueryBuilder|EloquentBuilder|Relation|ScoutBuilder $builder, array $scopes, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo, callable $directiveFilter = null): bool + public function wouldEnhanceBuilder(Builder|ScoutBuilder $builder, array $scopes, mixed $root, array $args, GraphQLContext $context, callable $directiveFilter = null): bool { - $argumentSet = $resolveInfo->argumentSet; - - return (new ScoutEnhancer($argumentSet, $builder))->wouldEnhanceBuilder() - || self::wouldApplyArgBuilderDirectives($argumentSet, $builder, $directiveFilter) - || self::wouldApplyFieldBuilderDirectives($resolveInfo) + return (new ScoutEnhancer($this->argumentSet, $builder))->wouldEnhanceBuilder() + || self::wouldApplyArgBuilderDirectives($this->argumentSet, $builder, $directiveFilter) + || self::wouldApplyFieldBuilderDirectives($this) || $scopes !== []; } /** * Recursively apply the ArgBuilderDirectives onto the builder. * - * @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Relations\Relation<\Illuminate\Database\Eloquent\Model> $builder + * @param \Illuminate\Contracts\Database\Query\Builder $builder * @param (callable(\Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective): bool)|null $directiveFilter */ - protected static function applyArgBuilderDirectives(ArgumentSet $argumentSet, QueryBuilder|EloquentBuilder|Relation &$builder, callable $directiveFilter = null): void + protected static function applyArgBuilderDirectives(ArgumentSet $argumentSet, Builder &$builder, callable $directiveFilter = null): void { foreach ($argumentSet->arguments as $argument) { $value = $argument->toPlain(); @@ -122,10 +115,9 @@ static function ($value) use (&$builder, $directiveFilter): void { /** * Would there be any ArgBuilderDirectives to apply to the builder? * - * @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Relations\Relation<\Illuminate\Database\Eloquent\Model> $builder * @param (callable(\Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective): bool)|null $directiveFilter */ - protected static function wouldApplyArgBuilderDirectives(ArgumentSet $argumentSet, QueryBuilder|EloquentBuilder|Relation &$builder, callable $directiveFilter = null): bool + protected static function wouldApplyArgBuilderDirectives(ArgumentSet $argumentSet, Builder &$builder, callable $directiveFilter = null): bool { foreach ($argumentSet->arguments as $argument) { $filteredDirectives = $argument @@ -164,10 +156,9 @@ protected static function wouldApplyArgBuilderDirectives(ArgumentSet $argumentSe /** * Apply the FieldBuilderDirectives onto the builder. * - * @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Relations\Relation<\Illuminate\Database\Eloquent\Model> $builder * @param array $args */ - protected static function applyFieldBuilderDirectives(QueryBuilder|EloquentBuilder|Relation &$builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): void + protected static function applyFieldBuilderDirectives(Builder &$builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): void { foreach (self::fieldBuilderDirectives($resolveInfo) as $fieldBuilderDirective) { $builder = $fieldBuilderDirective->handleFieldBuilder($builder, $root, $args, $context, $resolveInfo); diff --git a/src/OrderBy/OrderByDirective.php b/src/OrderBy/OrderByDirective.php index d20dfb837d..6894ab4566 100644 --- a/src/OrderBy/OrderByDirective.php +++ b/src/OrderBy/OrderByDirective.php @@ -7,9 +7,8 @@ use GraphQL\Language\AST\InterfaceTypeDefinitionNode; use GraphQL\Language\AST\ObjectTypeDefinitionNode; use GraphQL\Language\Parser; +use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; use Illuminate\Support\Arr; use Illuminate\Support\Str; use Nuwave\Lighthouse\Exceptions\DefinitionException; @@ -112,7 +111,7 @@ enum OrderByDirection { } /** @param array> $value */ - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { foreach ($value as $orderByClause) { $order = Arr::pull($orderByClause, 'order'); @@ -260,7 +259,7 @@ public function manipulateArgDefinition( } } - public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation + public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder { return $builder->orderBy( $this->directiveArgValue('column'), diff --git a/src/Pagination/PaginateDirective.php b/src/Pagination/PaginateDirective.php index d1c2e904b4..175a16d61c 100644 --- a/src/Pagination/PaginateDirective.php +++ b/src/Pagination/PaginateDirective.php @@ -6,14 +6,11 @@ use GraphQL\Language\AST\InterfaceTypeDefinitionNode; use GraphQL\Language\AST\ObjectTypeDefinitionNode; use Illuminate\Contracts\Pagination\Paginator; -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\Cache\CacheDirective; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Schema\AST\DocumentAST; use Nuwave\Lighthouse\Schema\Directives\BaseDirective; +use Nuwave\Lighthouse\Schema\Directives\Traits\HasBuilderArgument; use Nuwave\Lighthouse\Schema\Values\FieldValue; use Nuwave\Lighthouse\Support\Contracts\ComplexityResolverDirective; use Nuwave\Lighthouse\Support\Contracts\Directive; @@ -23,6 +20,8 @@ class PaginateDirective extends BaseDirective implements FieldResolver, FieldManipulator, ComplexityResolverDirective { + use HasBuilderArgument; + public static function definition(): string { return /** @lang GraphQL */ <<<'GRAPHQL' @@ -152,26 +151,12 @@ public function resolveField(FieldValue $fieldValue): callable return $paginator; } - if ($this->directiveHasArgument('builder')) { - $builderResolver = $this->getResolverFromArgument('builder'); - - $query = $builderResolver($root, $args, $context, $resolveInfo); - - assert( - $query instanceof QueryBuilder || $query instanceof EloquentBuilder || $query instanceof ScoutBuilder || $query instanceof Relation, - "The method referenced by the builder argument of the @{$this->name()} directive on {$this->nodeName()} must return a Builder or Relation.", - ); - } else { - $query = $this->getModelClass()::query(); - } - $query = $resolveInfo->enhanceBuilder( - $query, + $this->makeBuilder($root, $args, $context, $resolveInfo), $this->directiveArgValue('scopes', []), $root, $args, $context, - $resolveInfo, ); $paginationArgs = PaginationArgs::extractArgs($args, $this->paginationType(), $this->paginateMaxCount()); diff --git a/src/Pagination/PaginationArgs.php b/src/Pagination/PaginationArgs.php index b2a52e5e3e..3df6cefab6 100644 --- a/src/Pagination/PaginationArgs.php +++ b/src/Pagination/PaginationArgs.php @@ -3,10 +3,8 @@ namespace Nuwave\Lighthouse\Pagination; use GraphQL\Error\Error; +use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Contracts\Pagination\Paginator; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; use Illuminate\Support\Arr; use Laravel\Scout\Builder as ScoutBuilder; @@ -74,13 +72,9 @@ protected static function calculateCurrentPage(int $first, int $after, int $defa /** * Apply the args to a builder, constructing a paginator. * - * @template TModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Query\Builder|\Laravel\Scout\Builder|\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Relations\Relation $builder - * - * @return \Illuminate\Contracts\Pagination\Paginator + * @return \Illuminate\Contracts\Pagination\Paginator<\Illuminate\Database\Eloquent\Model> */ - public function applyToBuilder(QueryBuilder|ScoutBuilder|EloquentBuilder|Relation $builder): Paginator + public function applyToBuilder(Builder|ScoutBuilder $builder): Paginator { $methodName = $this->type->isSimple() ? 'simplePaginate' diff --git a/src/Schema/Directives/AggregateDirective.php b/src/Schema/Directives/AggregateDirective.php index b0a4811f7d..d316b6c8d0 100644 --- a/src/Schema/Directives/AggregateDirective.php +++ b/src/Schema/Directives/AggregateDirective.php @@ -6,15 +6,15 @@ use GraphQL\Language\AST\FieldDefinitionNode; use GraphQL\Language\AST\InterfaceTypeDefinitionNode; use GraphQL\Language\AST\ObjectTypeDefinitionNode; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Query\Builder as QueryBuilder; use Nuwave\Lighthouse\Exceptions\DefinitionException; use Nuwave\Lighthouse\Execution\BatchLoader\BatchLoaderRegistry; use Nuwave\Lighthouse\Execution\BatchLoader\RelationBatchLoader; use Nuwave\Lighthouse\Execution\ModelsLoader\AggregateModelsLoader; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Schema\AST\DocumentAST; +use Nuwave\Lighthouse\Schema\Directives\Traits\RelationDirectiveHelpers; use Nuwave\Lighthouse\Schema\Values\FieldValue; use Nuwave\Lighthouse\Support\Contracts\FieldManipulator; use Nuwave\Lighthouse\Support\Contracts\FieldResolver; @@ -144,8 +144,8 @@ public function resolveField(FieldValue $fieldValue): callable $builder = $builderResolver($root, $args, $context, $resolveInfo); assert( - $builder instanceof QueryBuilder || $builder instanceof EloquentBuilder, - "The method referenced by the builder argument of the @{$this->name()} directive on {$this->nodeName()} must return a Builder.", + $builder instanceof Builder, + "The method referenced by the builder argument of the @{$this->name()} directive on {$this->nodeName()} must return a Builder or Relation.", ); $this->makeBuilderDecorator($root, $args, $context, $resolveInfo)($builder); diff --git a/src/Schema/Directives/AllDirective.php b/src/Schema/Directives/AllDirective.php index 962b8ff6bd..2a306f39bc 100644 --- a/src/Schema/Directives/AllDirective.php +++ b/src/Schema/Directives/AllDirective.php @@ -5,13 +5,10 @@ use GraphQL\Language\AST\FieldDefinitionNode; use GraphQL\Language\AST\InterfaceTypeDefinitionNode; use GraphQL\Language\AST\ObjectTypeDefinitionNode; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; use Illuminate\Support\Collection; -use Laravel\Scout\Builder as ScoutBuilder; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Schema\AST\DocumentAST; +use Nuwave\Lighthouse\Schema\Directives\Traits\HasBuilderArgument; use Nuwave\Lighthouse\Schema\Values\FieldValue; use Nuwave\Lighthouse\Support\Contracts\FieldManipulator; use Nuwave\Lighthouse\Support\Contracts\FieldResolver; @@ -19,6 +16,8 @@ class AllDirective extends BaseDirective implements FieldResolver, FieldManipulator { + use HasBuilderArgument; + public static function definition(): string { return /** @lang GraphQL */ <<<'GRAPHQL' @@ -51,30 +50,15 @@ public static function definition(): string public function resolveField(FieldValue $fieldValue): callable { - return function (mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Collection { - if ($this->directiveHasArgument('builder')) { - $builderResolver = $this->getResolverFromArgument('builder'); - - $query = $builderResolver($root, $args, $context, $resolveInfo); - assert( - $query instanceof QueryBuilder || $query instanceof EloquentBuilder || $query instanceof ScoutBuilder || $query instanceof Relation, - "The method referenced by the builder argument of the @{$this->name()} directive on {$this->nodeName()} must return a Builder or Relation.", - ); - } else { - $query = $this->getModelClass()::query(); - } - - return $resolveInfo - ->enhanceBuilder( - $query, - $this->directiveArgValue('scopes', []), - $root, - $args, - $context, - $resolveInfo, - ) - ->get(); - }; + return fn (mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Collection => $resolveInfo + ->enhanceBuilder( + $this->makeBuilder($root, $args, $context, $resolveInfo), + $this->directiveArgValue('scopes', []), + $root, + $args, + $context, + ) + ->get(); } public function manipulateFieldDefinition(DocumentAST &$documentAST, FieldDefinitionNode &$fieldDefinition, ObjectTypeDefinitionNode|InterfaceTypeDefinitionNode &$parentType): void diff --git a/src/Schema/Directives/BuilderDirective.php b/src/Schema/Directives/BuilderDirective.php index e9a40c6e14..00afbf9aa5 100644 --- a/src/Schema/Directives/BuilderDirective.php +++ b/src/Schema/Directives/BuilderDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Laravel\Scout\Builder as ScoutBuilder; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Scout\ScoutBuilderDirective; @@ -42,7 +40,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { $resolver = $this->resolver(); @@ -56,7 +54,7 @@ public function handleScoutBuilder(ScoutBuilder $builder, mixed $value): ScoutBu return $resolver($builder, $value, $this->definitionNode); } - public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation + public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder { $resolver = $this->resolver(); diff --git a/src/Schema/Directives/CountDirective.php b/src/Schema/Directives/CountDirective.php index eac1d21bac..f1ab9e73cb 100644 --- a/src/Schema/Directives/CountDirective.php +++ b/src/Schema/Directives/CountDirective.php @@ -13,6 +13,7 @@ use Nuwave\Lighthouse\Execution\ModelsLoader\CountModelsLoader; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Schema\AST\DocumentAST; +use Nuwave\Lighthouse\Schema\Directives\Traits\RelationDirectiveHelpers; use Nuwave\Lighthouse\Schema\Values\FieldValue; use Nuwave\Lighthouse\Support\Contracts\FieldManipulator; use Nuwave\Lighthouse\Support\Contracts\FieldResolver; diff --git a/src/Schema/Directives/EqDirective.php b/src/Schema/Directives/EqDirective.php index c05340b688..12710e355e 100644 --- a/src/Schema/Directives/EqDirective.php +++ b/src/Schema/Directives/EqDirective.php @@ -5,9 +5,7 @@ use GraphQL\Language\AST\FieldDefinitionNode; use GraphQL\Language\AST\InterfaceTypeDefinitionNode; use GraphQL\Language\AST\ObjectTypeDefinitionNode; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Laravel\Scout\Builder as ScoutBuilder; use Nuwave\Lighthouse\Exceptions\DefinitionException; use Nuwave\Lighthouse\Execution\ResolveInfo; @@ -49,7 +47,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { return $builder->where( $this->directiveArgValue('key', $this->nodeName()), @@ -76,7 +74,7 @@ public function manipulateFieldDefinition(DocumentAST &$documentAST, FieldDefini } } - public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation + public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder { return $this->handleBuilder( $builder, diff --git a/src/Schema/Directives/FindDirective.php b/src/Schema/Directives/FindDirective.php index fc42a8e67e..9b62f53c8f 100644 --- a/src/Schema/Directives/FindDirective.php +++ b/src/Schema/Directives/FindDirective.php @@ -42,7 +42,6 @@ public function resolveField(FieldValue $fieldValue): callable $root, $args, $context, - $resolveInfo, ) ->get(); diff --git a/src/Schema/Directives/FirstDirective.php b/src/Schema/Directives/FirstDirective.php index 4d3d166a17..5b6f64fb22 100644 --- a/src/Schema/Directives/FirstDirective.php +++ b/src/Schema/Directives/FirstDirective.php @@ -41,7 +41,6 @@ public function resolveField(FieldValue $fieldValue): callable $root, $args, $context, - $resolveInfo, ); assert($builder instanceof EloquentBuilder); diff --git a/src/Schema/Directives/InDirective.php b/src/Schema/Directives/InDirective.php index 9e44c855f7..dd9a614ae9 100644 --- a/src/Schema/Directives/InDirective.php +++ b/src/Schema/Directives/InDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; class InDirective extends BaseDirective implements ArgBuilderDirective @@ -25,7 +23,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { return $builder->whereIn( $this->directiveArgValue('key', $this->nodeName()), diff --git a/src/Schema/Directives/LikeDirective.php b/src/Schema/Directives/LikeDirective.php index b7748fa5ba..bc66c87512 100644 --- a/src/Schema/Directives/LikeDirective.php +++ b/src/Schema/Directives/LikeDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; use Nuwave\Lighthouse\Support\Contracts\FieldBuilderDirective; @@ -52,7 +50,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { if ($value === null) { return $builder; @@ -70,7 +68,7 @@ public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $v ); } - public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation + public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder { return $this->handleBuilder( $builder, diff --git a/src/Schema/Directives/ModifyModelExistenceDirective.php b/src/Schema/Directives/ModifyModelExistenceDirective.php index 6b9fe37aea..5859017413 100644 --- a/src/Schema/Directives/ModifyModelExistenceDirective.php +++ b/src/Schema/Directives/ModifyModelExistenceDirective.php @@ -34,11 +34,11 @@ public function resolveField(FieldValue $fieldValue): callable return function (mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) use ($modelClass, $scopes, $expectsList): EloquentCollection|Model|null { $builder = $modelClass::query(); - if (! $resolveInfo->wouldEnhanceBuilder($builder, $scopes, $root, $args, $context, $resolveInfo)) { + if (! $resolveInfo->wouldEnhanceBuilder($builder, $scopes, $root, $args, $context)) { throw self::wouldModifyAll(); } - $builder = $resolveInfo->enhanceBuilder($builder, $scopes, $root, $args, $context, $resolveInfo); + $builder = $resolveInfo->enhanceBuilder($builder, $scopes, $root, $args, $context); assert($builder instanceof EloquentBuilder); $modelOrModels = $this->enhanceBuilder($builder)->get(); diff --git a/src/Schema/Directives/NeqDirective.php b/src/Schema/Directives/NeqDirective.php index c4c513388a..6427f7c468 100644 --- a/src/Schema/Directives/NeqDirective.php +++ b/src/Schema/Directives/NeqDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; class NeqDirective extends BaseDirective implements ArgBuilderDirective @@ -25,7 +23,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { return $builder->where( $this->directiveArgValue('key', $this->nodeName()), diff --git a/src/Schema/Directives/NotInDirective.php b/src/Schema/Directives/NotInDirective.php index bdf8914221..2b62fc3742 100644 --- a/src/Schema/Directives/NotInDirective.php +++ b/src/Schema/Directives/NotInDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; class NotInDirective extends BaseDirective implements ArgBuilderDirective @@ -25,7 +23,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { return $builder->whereNotIn( $this->directiveArgValue('key', $this->nodeName()), diff --git a/src/Schema/Directives/RelationDirective.php b/src/Schema/Directives/RelationDirective.php index b51fc5ac86..a79eff7af8 100644 --- a/src/Schema/Directives/RelationDirective.php +++ b/src/Schema/Directives/RelationDirective.php @@ -21,6 +21,7 @@ use Nuwave\Lighthouse\Pagination\PaginationType; use Nuwave\Lighthouse\Schema\AST\ASTHelper; use Nuwave\Lighthouse\Schema\AST\DocumentAST; +use Nuwave\Lighthouse\Schema\Directives\Traits\RelationDirectiveHelpers; use Nuwave\Lighthouse\Schema\Values\FieldValue; use Nuwave\Lighthouse\Support\Contracts\FieldResolver; use Nuwave\Lighthouse\Support\Contracts\GraphQLContext; diff --git a/src/Schema/Directives/ScopeDirective.php b/src/Schema/Directives/ScopeDirective.php index cf98d358ee..2e75a60b22 100644 --- a/src/Schema/Directives/ScopeDirective.php +++ b/src/Schema/Directives/ScopeDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Exceptions\DefinitionException; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; @@ -28,7 +26,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { $scope = $this->directiveArgValue('name', $this->nodeName()); diff --git a/src/Schema/Directives/Traits/HasBuilderArgument.php b/src/Schema/Directives/Traits/HasBuilderArgument.php new file mode 100644 index 0000000000..aeef05e32a --- /dev/null +++ b/src/Schema/Directives/Traits/HasBuilderArgument.php @@ -0,0 +1,31 @@ + $args */ + private function makeBuilder(mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder|ScoutBuilder + { + if (! $this->directiveHasArgument('builder')) { + return $this->getModelClass()::query(); + } + + $builderResolver = $this->getResolverFromArgument('builder'); + + $builder = $builderResolver($root, $args, $context, $resolveInfo); + + assert( + $builder instanceof Builder || $builder instanceof ScoutBuilder, + "The method referenced by the builder argument of the @{$this->name()} directive on {$this->nodeName()} must return a Scout Builder, Query Builder or Relation.", + ); + + return $builder; + } +} diff --git a/src/Schema/Directives/RelationDirectiveHelpers.php b/src/Schema/Directives/Traits/RelationDirectiveHelpers.php similarity index 72% rename from src/Schema/Directives/RelationDirectiveHelpers.php rename to src/Schema/Directives/Traits/RelationDirectiveHelpers.php index 4f70e98d90..7caf25a7f9 100644 --- a/src/Schema/Directives/RelationDirectiveHelpers.php +++ b/src/Schema/Directives/Traits/RelationDirectiveHelpers.php @@ -1,10 +1,9 @@ directiveArgValue('relation', $this->nodeName()); } - /** - * @param array $args - * - * @return \Closure(QueryBuilder|\Illuminate\Database\Eloquent\Builder<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Relations\Relation<\Illuminate\Database\Eloquent\Model>): void - */ + /** @param array $args */ protected function makeBuilderDecorator(mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): \Closure { - return function (object $builder) use ($root, $args, $context, $resolveInfo): void { + return function (Builder $builder) use ($root, $args, $context, $resolveInfo): void { if ($builder instanceof Relation) { $builder = $builder->getQuery(); } - assert($builder instanceof QueryBuilder || $builder instanceof EloquentBuilder); - $resolveInfo->enhanceBuilder( $builder, $this->scopes(), $root, $args, $context, - $resolveInfo, ); }; } diff --git a/src/Schema/Directives/WhereBetweenDirective.php b/src/Schema/Directives/WhereBetweenDirective.php index 612b9e542d..e79644f6c0 100644 --- a/src/Schema/Directives/WhereBetweenDirective.php +++ b/src/Schema/Directives/WhereBetweenDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; class WhereBetweenDirective extends BaseDirective implements ArgBuilderDirective @@ -28,7 +26,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { return $builder->whereBetween( $this->directiveArgValue('key', $this->nodeName()), diff --git a/src/Schema/Directives/WhereDirective.php b/src/Schema/Directives/WhereDirective.php index 4fb4c5121a..6c5b39cee7 100644 --- a/src/Schema/Directives/WhereDirective.php +++ b/src/Schema/Directives/WhereDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; use Nuwave\Lighthouse\Support\Contracts\FieldBuilderDirective; @@ -50,7 +48,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { // Allow users to overwrite the default "where" clause, e.g. "whereYear" $clause = $this->directiveArgValue('clause', 'where'); @@ -62,7 +60,7 @@ public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $v ); } - public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation + public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder { return $this->handleBuilder( $builder, diff --git a/src/Schema/Directives/WhereJsonContainsDirective.php b/src/Schema/Directives/WhereJsonContainsDirective.php index 9f18f1cfd3..4334acf8b4 100644 --- a/src/Schema/Directives/WhereJsonContainsDirective.php +++ b/src/Schema/Directives/WhereJsonContainsDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; class WhereJsonContainsDirective extends BaseDirective implements ArgBuilderDirective @@ -25,7 +23,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { return $builder->whereJsonContains( $this->directiveArgValue('key', $this->nodeName()), diff --git a/src/Schema/Directives/WhereKeyDirective.php b/src/Schema/Directives/WhereKeyDirective.php index c6498560a0..a7df66c191 100644 --- a/src/Schema/Directives/WhereKeyDirective.php +++ b/src/Schema/Directives/WhereKeyDirective.php @@ -5,9 +5,8 @@ use GraphQL\Language\AST\FieldDefinitionNode; use GraphQL\Language\AST\InterfaceTypeDefinitionNode; use GraphQL\Language\AST\ObjectTypeDefinitionNode; +use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; use Nuwave\Lighthouse\Exceptions\DefinitionException; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Schema\AST\DocumentAST; @@ -39,7 +38,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { if (! $builder instanceof EloquentBuilder) { $notEloquentBuilder = $builder::class; @@ -56,7 +55,7 @@ public function manipulateFieldDefinition(DocumentAST &$documentAST, FieldDefini } } - public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation + public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder { return $this->handleBuilder( $builder, diff --git a/src/Schema/Directives/WhereNotBetweenDirective.php b/src/Schema/Directives/WhereNotBetweenDirective.php index 3ba9223555..57ce3b28cc 100644 --- a/src/Schema/Directives/WhereNotBetweenDirective.php +++ b/src/Schema/Directives/WhereNotBetweenDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; class WhereNotBetweenDirective extends BaseDirective implements ArgBuilderDirective @@ -28,7 +26,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { return $builder->whereNotBetween( $this->directiveArgValue('key', $this->nodeName()), diff --git a/src/Schema/Directives/WhereNotNullDirective.php b/src/Schema/Directives/WhereNotNullDirective.php index 6f97a55126..c6f18cd929 100644 --- a/src/Schema/Directives/WhereNotNullDirective.php +++ b/src/Schema/Directives/WhereNotNullDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; use Nuwave\Lighthouse\Support\Contracts\FieldBuilderDirective; @@ -34,7 +32,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { if ($value === null) { return $builder; @@ -47,7 +45,7 @@ public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $v ); } - public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation + public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder { return $this->handleBuilder( $builder, diff --git a/src/Schema/Directives/WhereNullDirective.php b/src/Schema/Directives/WhereNullDirective.php index d0f6990502..1bc1c7d5eb 100644 --- a/src/Schema/Directives/WhereNullDirective.php +++ b/src/Schema/Directives/WhereNullDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Schema\Directives; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Support\Contracts\ArgBuilderDirective; use Nuwave\Lighthouse\Support\Contracts\FieldBuilderDirective; @@ -34,7 +32,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { if ($value === null) { return $builder; @@ -47,7 +45,7 @@ public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $v ); } - public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation + public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder { return $this->handleBuilder( $builder, diff --git a/src/Schema/Directives/WithRelationDirective.php b/src/Schema/Directives/WithRelationDirective.php index 6c4f5461e4..4fe532feda 100644 --- a/src/Schema/Directives/WithRelationDirective.php +++ b/src/Schema/Directives/WithRelationDirective.php @@ -8,6 +8,7 @@ use Nuwave\Lighthouse\Execution\BatchLoader\RelationBatchLoader; use Nuwave\Lighthouse\Execution\ModelsLoader\ModelsLoader; use Nuwave\Lighthouse\Execution\ResolveInfo; +use Nuwave\Lighthouse\Schema\Directives\Traits\RelationDirectiveHelpers; use Nuwave\Lighthouse\Schema\Values\FieldValue; use Nuwave\Lighthouse\Support\Contracts\FieldMiddleware; use Nuwave\Lighthouse\Support\Contracts\GraphQLContext; diff --git a/src/Scout/ScoutEnhancer.php b/src/Scout/ScoutEnhancer.php index 17a278f5e1..5d7972482b 100644 --- a/src/Scout/ScoutEnhancer.php +++ b/src/Scout/ScoutEnhancer.php @@ -2,9 +2,8 @@ namespace Nuwave\Lighthouse\Scout; +use Illuminate\Contracts\Database\Query\Builder; 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 Laravel\Scout\Searchable; use Nuwave\Lighthouse\Execution\Arguments\Argument; @@ -41,9 +40,9 @@ class ScoutEnhancer public function __construct( protected ArgumentSet $argumentSet, /** - * @var \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Relations\Relation|\Laravel\Scout\Builder $builder + * @var \Illuminate\Contracts\Database\Query\Builder|\Laravel\Scout\Builder $builder */ - protected QueryBuilder|EloquentBuilder|Relation|ScoutBuilder $builder, + protected Builder|ScoutBuilder $builder, ) { $this->gather($this->argumentSet); } diff --git a/src/SoftDeletes/TrashedDirective.php b/src/SoftDeletes/TrashedDirective.php index dc95329a77..b9e41a7011 100644 --- a/src/SoftDeletes/TrashedDirective.php +++ b/src/SoftDeletes/TrashedDirective.php @@ -3,10 +3,9 @@ namespace Nuwave\Lighthouse\SoftDeletes; use GraphQL\Error\Error; +use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Model; -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; @@ -26,7 +25,7 @@ public static function definition(): string GRAPHQL; } - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { if (! $builder instanceof EloquentBuilder) { $notEloquentBuilder = $builder::class; diff --git a/src/Support/Contracts/ArgBuilderDirective.php b/src/Support/Contracts/ArgBuilderDirective.php index 8204ee1af8..dd9b3f40df 100644 --- a/src/Support/Contracts/ArgBuilderDirective.php +++ b/src/Support/Contracts/ArgBuilderDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Support\Contracts; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; interface ArgBuilderDirective extends Directive { @@ -13,10 +11,10 @@ interface ArgBuilderDirective extends Directive * * TODO try adding a generic type parameter for the type of model when PHPStan handles it better * - * @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Relations\Relation<\Illuminate\Database\Eloquent\Model> $builder the builder used to resolve the field - * @param mixed $value the client given value of the argument + * @param \Illuminate\Contracts\Database\Query\Builder $builder the builder used to resolve the field + * @param mixed $value the client given value of the argument * - * @return \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Relations\Relation<\Illuminate\Database\Eloquent\Model> the modified builder + * @return \Illuminate\Contracts\Database\Query\Builder the modified builder */ - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $value): QueryBuilder|EloquentBuilder|Relation; + public function handleBuilder(Builder $builder, mixed $value): Builder; } diff --git a/src/Support/Contracts/FieldBuilderDirective.php b/src/Support/Contracts/FieldBuilderDirective.php index 09d65bb499..7a683589cc 100644 --- a/src/Support/Contracts/FieldBuilderDirective.php +++ b/src/Support/Contracts/FieldBuilderDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\Support\Contracts; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Execution\ResolveInfo; interface FieldBuilderDirective extends Directive @@ -19,5 +17,5 @@ interface FieldBuilderDirective extends Directive * * @return \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Relations\Relation<\Illuminate\Database\Eloquent\Model> the modified builder */ - public function handleFieldBuilder(QueryBuilder|EloquentBuilder|Relation $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): QueryBuilder|EloquentBuilder|Relation; + public function handleFieldBuilder(Builder $builder, mixed $root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Builder; } diff --git a/src/WhereConditions/Operator.php b/src/WhereConditions/Operator.php index 7969f21464..ce2608a2b5 100644 --- a/src/WhereConditions/Operator.php +++ b/src/WhereConditions/Operator.php @@ -2,8 +2,7 @@ namespace Nuwave\Lighthouse\WhereConditions; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; /** * An Operator handles the database or application specific bits @@ -31,12 +30,7 @@ public function defaultHasOperator(): string; /** * Apply the conditions to the query builder. * - * @template TModel of \Illuminate\Database\Eloquent\Model - * - * @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $builder * @param array $whereConditions - * - * @return \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder */ - public function applyConditions(QueryBuilder|EloquentBuilder $builder, array $whereConditions, string $boolean): QueryBuilder|EloquentBuilder; + public function applyConditions(Builder $builder, array $whereConditions, string $boolean): Builder; } diff --git a/src/WhereConditions/SQLOperator.php b/src/WhereConditions/SQLOperator.php index cb6b244e9f..68175eeaf0 100644 --- a/src/WhereConditions/SQLOperator.php +++ b/src/WhereConditions/SQLOperator.php @@ -3,8 +3,7 @@ namespace Nuwave\Lighthouse\WhereConditions; use GraphQL\Error\Error; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; class SQLOperator implements Operator { @@ -73,7 +72,7 @@ public function defaultHasOperator(): string return 'GTE'; } - public function applyConditions(QueryBuilder|EloquentBuilder $builder, array $whereConditions, string $boolean): QueryBuilder|EloquentBuilder + public function applyConditions(Builder $builder, array $whereConditions, string $boolean): Builder { $column = $whereConditions['column']; diff --git a/src/WhereConditions/WhereConditionsBaseDirective.php b/src/WhereConditions/WhereConditionsBaseDirective.php index ca608782e0..88c0dd7f08 100644 --- a/src/WhereConditions/WhereConditionsBaseDirective.php +++ b/src/WhereConditions/WhereConditionsBaseDirective.php @@ -8,9 +8,7 @@ use GraphQL\Language\AST\ObjectTypeDefinitionNode; use GraphQL\Language\Parser; use Illuminate\Container\Container; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; use Nuwave\Lighthouse\Schema\AST\ASTHelper; use Nuwave\Lighthouse\Schema\AST\DocumentAST; use Nuwave\Lighthouse\Schema\Directives\BaseDirective; @@ -26,7 +24,7 @@ abstract class WhereConditionsBaseDirective extends BaseDirective implements Arg * @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<\Illuminate\Database\Eloquent\Model>|\Illuminate\Database\Eloquent\Relations\Relation<\Illuminate\Database\Eloquent\Model> $builder the builder used to resolve the field * @param array $value the client given value of the argument */ - protected function handle(QueryBuilder|EloquentBuilder|Relation $builder, array $value): void + protected function handle(Builder $builder, array $value): void { $handler = $this->directiveHasArgument('handler') ? $this->getResolverFromArgument('handler') diff --git a/src/WhereConditions/WhereConditionsDirective.php b/src/WhereConditions/WhereConditionsDirective.php index 16526d14e5..aea773c0ef 100644 --- a/src/WhereConditions/WhereConditionsDirective.php +++ b/src/WhereConditions/WhereConditionsDirective.php @@ -2,9 +2,7 @@ namespace Nuwave\Lighthouse\WhereConditions; -use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; +use Illuminate\Contracts\Database\Query\Builder; class WhereConditionsDirective extends WhereConditionsBaseDirective { @@ -46,7 +44,7 @@ public static function definition(): string } /** @param array|null $value */ - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { if ($value === null) { return $builder; diff --git a/src/WhereConditions/WhereConditionsHandler.php b/src/WhereConditions/WhereConditionsHandler.php index 85bfac77db..ddb29f28f4 100644 --- a/src/WhereConditions/WhereConditionsHandler.php +++ b/src/WhereConditions/WhereConditionsHandler.php @@ -3,9 +3,9 @@ namespace Nuwave\Lighthouse\WhereConditions; use GraphQL\Error\Error; +use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Query\Builder as QueryBuilder; class WhereConditionsHandler { @@ -79,7 +79,7 @@ public function handleHasCondition( string $operator, int $amount, array $condition = null, - ): QueryBuilder { + ): Builder { return $model ->newQuery() ->whereHas( diff --git a/src/WhereConditions/WhereHasConditionsDirective.php b/src/WhereConditions/WhereHasConditionsDirective.php index af4e29f4cb..ab211a1970 100644 --- a/src/WhereConditions/WhereHasConditionsDirective.php +++ b/src/WhereConditions/WhereHasConditionsDirective.php @@ -2,9 +2,8 @@ namespace Nuwave\Lighthouse\WhereConditions; +use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Query\Builder as QueryBuilder; use Illuminate\Support\Str; class WhereHasConditionsDirective extends WhereConditionsBaseDirective @@ -57,7 +56,7 @@ public static function definition(): string } /** @param array|null $value The client given conditions */ - public function handleBuilder(QueryBuilder|EloquentBuilder|Relation $builder, $value): QueryBuilder|EloquentBuilder|Relation + public function handleBuilder(Builder $builder, $value): Builder { if ($value === null) { return $builder; diff --git a/tests/Integration/Schema/Directives/BuilderDirectiveTest.php b/tests/Integration/Schema/Directives/BuilderDirectiveTest.php index df3679ce88..7041ee4fd4 100644 --- a/tests/Integration/Schema/Directives/BuilderDirectiveTest.php +++ b/tests/Integration/Schema/Directives/BuilderDirectiveTest.php @@ -2,8 +2,8 @@ namespace Tests\Integration\Schema\Directives; +use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; -use Illuminate\Database\Query\Builder as QueryBuilder; use Nuwave\Lighthouse\Execution\ResolveInfo; use Nuwave\Lighthouse\Support\Contracts\GraphQLContext; use Tests\DBTestCase; @@ -152,12 +152,7 @@ public function testCallsCustomBuilderMethodOnFieldWithoutValue(): void ')->assertJsonCount(2, 'data.users'); } - /** - * @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<\Tests\Utils\Models\User> $builder - * - * @return \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder<\Tests\Utils\Models\User> - */ - public static function limit(QueryBuilder|EloquentBuilder $builder, ?int $value): QueryBuilder|EloquentBuilder + public static function limit(Builder $builder, ?int $value): Builder { return $builder->limit($value ?? 2); }