required(), new FirstArgument(), new PageArgument(), ]; } /** * The base return type of the query. */ public function baseRebingType(): SearchType { return new SearchType(); } /** * @return array */ public function resolve($root, array $args, $context, ResolveInfo $resolveInfo) { $result = []; $fields = $resolveInfo->getFieldSelection(); if (Arr::get($fields, 'anime')) { $result['anime'] = $this->search(Anime::class, $args, $resolveInfo, new AnimeType, 'anime'); } if (Arr::get($fields, 'artists')) { $result['artists'] = $this->search(Artist::class, $args, $resolveInfo, new ArtistType, 'artists'); } if (Arr::get($fields, 'animethemes')) { $result['animethemes'] = $this->search(AnimeTheme::class, $args, $resolveInfo, new AnimeThemeType, 'animethemes'); } if (Arr::get($fields, 'playlists')) { $result['playlists'] = $this->search(Playlist::class, $args, $resolveInfo, new PlaylistType, 'playlists'); } if (Arr::get($fields, 'series')) { $result['series'] = $this->search(Series::class, $args, $resolveInfo, new SeriesType, 'series'); } if (Arr::get($fields, 'songs')) { $result['songs'] = $this->search(Song::class, $args, $resolveInfo, new SongType, 'songs'); } if (Arr::get($fields, 'studios')) { $result['studios'] = $this->search(Studio::class, $args, $resolveInfo, new StudioType, 'studios'); } if (Arr::get($fields, 'videos')) { $result['videos'] = $this->search(Video::class, $args, $resolveInfo, new VideoType, 'videos'); } return $result; } /** * @param class-string $model */ protected function search(string $model, array $args, ResolveInfo $resolveInfo, EloquentType $type, string $field): array { $term = Arr::get($args, 'search'); $page = Arr::get($args, 'page'); $first = Number::clamp(Arr::get($args, 'first'), 1, 15); $fields = Arr::get($resolveInfo->getFieldSelectionWithAliases(100), "{$field}.{$field}.selectionSet"); /** @phpstan-ignore-next-line */ return $model::search($term) ->query(fn (Builder $builder) => $this->constrainEagerLoads($builder, $fields, $type)) ->paginate($first, $page) ->items(); } }