Created
January 6, 2019 20:05
-
-
Save dominikb/a4340cf33d35bace9e77def9d0e97ee0 to your computer and use it in GitHub Desktop.
Adds support for resolving type hinted models by id
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace Spatie\QueryBuilder\Filters; | |
| use Illuminate\Database\Eloquent\Builder; | |
| use Illuminate\Support\Collection; | |
| use ReflectionMethod; | |
| use ReflectionParameter; | |
| class FiltersScope implements Filter | |
| { | |
| public function __invoke(Builder $query, $values, string $property) : Builder | |
| { | |
| $scope = camel_case($property); | |
| $values = array_wrap($values); | |
| $values = $this->resolveTypeHintedParameters($query, $values, $scope); | |
| return $query->$scope(...$values); | |
| } | |
| protected function resolveTypeHintedParameters(Builder $query, $values, string $scope) | |
| { | |
| $fullScope = 'scope' . ucfirst($scope); | |
| $scopeReflector = (new ReflectionMethod($query->getModel(), $fullScope)); | |
| return (collect($scopeReflector->getParameters())) | |
| ->slice(1) | |
| ->zip($values) | |
| ->map(function (Collection $tuple) { | |
| /** @var ReflectionParameter $parameter */ | |
| [$parameter, $value] = $tuple->values(); | |
| if (! $parameter->hasType()) { | |
| return $value; | |
| } | |
| if ($parameter->getType()->isBuiltin()) { | |
| return $value; | |
| } | |
| $model = $parameter->getType()->getName(); | |
| return (new $model)->resolveRouteBinding($value); | |
| }); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment