Skip to content

Instantly share code, notes, and snippets.

@dominikb
Created January 6, 2019 20:05
Show Gist options
  • Select an option

  • Save dominikb/a4340cf33d35bace9e77def9d0e97ee0 to your computer and use it in GitHub Desktop.

Select an option

Save dominikb/a4340cf33d35bace9e77def9d0e97ee0 to your computer and use it in GitHub Desktop.
Adds support for resolving type hinted models by id
<?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