-
-
Notifications
You must be signed in to change notification settings - Fork 403
/
Copy pathFiltersQuery.php
79 lines (60 loc) · 2.15 KB
/
FiltersQuery.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
namespace Spatie\QueryBuilder\Concerns;
use Illuminate\Support\Collection;
use Spatie\QueryBuilder\AllowedFilter;
use Spatie\QueryBuilder\Exceptions\InvalidFilterQuery;
trait FiltersQuery
{
protected Collection $allowedFilters;
public function allowedFilters($filters): static
{
$filters = is_array($filters) ? $filters : func_get_args();
$this->allowedFilters = collect($filters)->map(function ($filter) {
if ($filter instanceof AllowedFilter) {
return $filter;
}
return AllowedFilter::partial($filter);
});
$this->ensureAllFiltersExist();
$this->addFiltersToQuery();
return $this;
}
protected function addFiltersToQuery(): void
{
$this->allowedFilters->each(function (AllowedFilter $filter) {
if ($this->isFilterRequested($filter)) {
$value = $this->request->filters()->get($filter->getName());
$filter->filter($this, $value);
return;
}
if ($filter->hasDefault()) {
$filter->filter($this, $filter->getDefault());
}
});
}
protected function findFilter(string $property): ?AllowedFilter
{
return $this->allowedFilters
->first(function (AllowedFilter $filter) use ($property) {
return $filter->isForFilter($property);
});
}
protected function isFilterRequested(AllowedFilter $allowedFilter): bool
{
return $this->request->filters()->has($allowedFilter->getName());
}
protected function ensureAllFiltersExist(): void
{
if (config('query-builder.disable_invalid_filter_query_exception', false)) {
return;
}
$filterNames = $this->request->filters()->keys();
$allowedFilterNames = $this->allowedFilters->map(function (AllowedFilter $allowedFilter) {
return $allowedFilter->getName();
});
$diff = $filterNames->diff($allowedFilterNames);
if ($diff->count()) {
throw InvalidFilterQuery::filtersNotAllowed($diff, $allowedFilterNames);
}
}
}