diff --git a/src/Http/Concerns/AllowsFilters.php b/src/Http/Concerns/AllowsFilters.php index ff741b6..a7729cc 100644 --- a/src/Http/Concerns/AllowsFilters.php +++ b/src/Http/Concerns/AllowsFilters.php @@ -22,35 +22,7 @@ trait AllowsFilters */ public function filters(): array { - $filters = []; - - $this->queryParameters()->each(function ($param) use (&$filters) { - $filterQueryParam = HeaderUtils::parseQuery($param); - - if (! is_array(head($filterQueryParam))) { - return; - } - - $filterQueryParamAttribute = head(array_keys($filterQueryParam)); - - if ($filterQueryParamAttribute !== 'filter') { - return; - } - - $filterQueryParam = head($filterQueryParam); - $filterQueryParamAttribute = head(array_keys($filterQueryParam)); - $filterQueryParamValue = head(array_values($filterQueryParam)); - - if (! isset($filters[$filterQueryParamAttribute])) { - $filters[$filterQueryParamAttribute] = [$filterQueryParamValue]; - - return; - } - - $filters[$filterQueryParamAttribute][] = $filterQueryParamValue; - }); - - return $filters; + return $this->queryParameters()->get('filter', []); } /** diff --git a/src/Http/Concerns/AllowsSorts.php b/src/Http/Concerns/AllowsSorts.php index 900543a..b05104a 100644 --- a/src/Http/Concerns/AllowsSorts.php +++ b/src/Http/Concerns/AllowsSorts.php @@ -22,7 +22,7 @@ trait AllowsSorts */ public function sorts() { - $sortsSourceArr = array_filter(explode(',', $this->request->get('sort', ''))); + $sortsSourceArr = array_filter(explode(',', $this->queryParameters()->get('sort', ''))); $sortsArr = []; while ($sort = array_pop($sortsSourceArr)) { diff --git a/src/Http/RequestQueryObject.php b/src/Http/RequestQueryObject.php index ec72e09..2c929d0 100644 --- a/src/Http/RequestQueryObject.php +++ b/src/Http/RequestQueryObject.php @@ -56,13 +56,38 @@ public function setQuery($query): self public function queryParameters(): Collection { if (! $this->queryParameters) { - $this->queryParameters = Collection::make( + $queryParameters = array_filter( array_map( [HeaderUtils::class, 'parseQuery'], explode('&', $this->request->server('QUERY_STRING', '')) ) - )->groupBy(fn ($item, $key) => head(array_keys($item)), true) - ->map(fn (Collection $collection) => $collection->flatten(1)->all()); + ); + + $this->queryParameters = Collection::make([]); + + foreach ($queryParameters as $value) { + $parameterKey = array_key_first($value); + + if (isset($this->queryParameters[$parameterKey]) && is_array($value[$parameterKey])) { + $this->queryParameters[$parameterKey] = array_merge_recursive( + $value[$parameterKey], + $this->queryParameters[$parameterKey] ?? [] + ); + + continue; + } + + if (isset($this->queryParameters[$parameterKey]) && is_string($value[$parameterKey])) { + $this->queryParameters[$parameterKey] = implode(',', array_merge( + explode(',', $value[$parameterKey]), + explode(',', $this->queryParameters[$parameterKey]) + )); + + continue; + } + + $this->queryParameters[$parameterKey] = $value[$parameterKey]; + } } return $this->queryParameters;