These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | namespace Spatie\QueryBuilder\Concerns; |
||
4 | |||
5 | use Spatie\QueryBuilder\AllowedSort; |
||
6 | use Spatie\QueryBuilder\Exceptions\InvalidSortQuery; |
||
7 | |||
8 | trait SortsQuery |
||
9 | { |
||
10 | /** @var \Illuminate\Support\Collection */ |
||
11 | protected $allowedSorts; |
||
12 | |||
13 | public function allowedSorts($sorts): self |
||
14 | { |
||
15 | if ($this->request->sorts()->isEmpty()) { |
||
16 | // We haven't got any requested sorts. No need to parse allowed sorts. |
||
17 | |||
18 | return $this; |
||
19 | } |
||
20 | |||
21 | $sorts = is_array($sorts) ? $sorts : func_get_args(); |
||
22 | |||
23 | $this->allowedSorts = collect($sorts)->map(function ($sort) { |
||
24 | if ($sort instanceof AllowedSort) { |
||
25 | return $sort; |
||
26 | } |
||
27 | |||
28 | return AllowedSort::field(ltrim($sort, '-')); |
||
29 | }); |
||
30 | |||
31 | if ($this->ensureAllSortsExist()) { |
||
32 | $this->addRequestedSortsToQuery(); // allowed is known & request is known, add what we can, if there is no request, -wait |
||
33 | } |
||
34 | |||
35 | return $this; |
||
36 | } |
||
37 | |||
38 | /** |
||
39 | * @param array|string|\Spatie\QueryBuilder\AllowedSort $sorts |
||
40 | * |
||
41 | * @return \Spatie\QueryBuilder\QueryBuilder |
||
42 | */ |
||
43 | public function defaultSort($sorts): self |
||
0 ignored issues
–
show
|
|||
44 | { |
||
45 | return $this->defaultSorts(func_get_args()); |
||
46 | } |
||
47 | |||
48 | /** |
||
49 | * @param array|string|\Spatie\QueryBuilder\AllowedSort $sorts |
||
50 | * |
||
51 | * @return \Spatie\QueryBuilder\QueryBuilder |
||
52 | */ |
||
53 | public function defaultSorts($sorts): self |
||
54 | { |
||
55 | if ($this->request->sorts()->isNotEmpty()) { |
||
56 | // We've got requested sorts. No need to parse defaults. |
||
57 | |||
58 | return $this; |
||
59 | } |
||
60 | |||
61 | $sorts = is_array($sorts) ? $sorts : func_get_args(); |
||
62 | |||
63 | collect($sorts) |
||
64 | ->map(function ($sort) { |
||
65 | if ($sort instanceof AllowedSort) { |
||
66 | return $sort; |
||
67 | } |
||
68 | |||
69 | return AllowedSort::field($sort); |
||
70 | }) |
||
71 | ->each(function (AllowedSort $sort) { |
||
72 | $sort->sort($this); |
||
73 | }); |
||
74 | |||
75 | return $this; |
||
76 | } |
||
77 | |||
78 | protected function addRequestedSortsToQuery() |
||
79 | { |
||
80 | $this->request->sorts() |
||
81 | ->each(function (string $property) { |
||
82 | $descending = $property[0] === '-'; |
||
83 | |||
84 | $key = ltrim($property, '-'); |
||
85 | |||
86 | $sort = $this->findSort($key); |
||
87 | |||
88 | $sort->sort($this, $descending); |
||
89 | }); |
||
90 | } |
||
91 | |||
92 | protected function findSort(string $property): ?AllowedSort |
||
93 | { |
||
94 | return $this->allowedSorts |
||
95 | ->first(function (AllowedSort $sort) use ($property) { |
||
96 | return $sort->isSort($property); |
||
97 | }); |
||
98 | } |
||
99 | |||
100 | protected function ensureAllSortsExist(): bool |
||
101 | { |
||
102 | $requestedSortNames = $this->request->sorts()->map(function (string $sort) { |
||
103 | return ltrim($sort, '-'); |
||
104 | }); |
||
105 | |||
106 | $allowedSortNames = $this->allowedSorts->map(function (AllowedSort $sort) { |
||
107 | return $sort->getName(); |
||
108 | }); |
||
109 | |||
110 | $unknownSorts = $requestedSortNames->diff($allowedSortNames); |
||
111 | |||
112 | if ($unknownSorts->isNotEmpty()) { |
||
113 | if ($this->throwInvalidQueryExceptions) { |
||
114 | throw InvalidSortQuery::sortsNotAllowed($unknownSorts, $allowedSortNames); |
||
115 | } else { |
||
116 | return false; |
||
117 | } |
||
118 | } |
||
119 | |||
120 | return true; |
||
121 | } |
||
122 | } |
||
123 |
This check looks from parameters that have been defined for a function or method, but which are not used in the method body.