Skip to content

Commit debb180

Browse files
[8.x] Harden OrderBys (#798)
1 parent 9b47bf7 commit debb180

File tree

5 files changed

+18
-8
lines changed

5 files changed

+18
-8
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
"pixelfear/composer-dist-plugin": "^0.1.5",
4646
"spatie/ignition": "^1.15",
4747
"spatie/invade": "^2.1",
48-
"statamic/cms": "^5.41",
48+
"statamic/cms": "^5.73.18",
4949
"stillat/proteus": "^4.0"
5050
},
5151
"require-dev": {

src/Fieldtypes/BaseFieldtype.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Statamic\Facades\Search;
1616
use Statamic\Fieldtypes\Relationship;
1717
use Statamic\Http\Requests\FilteredRequest;
18+
use Statamic\Query\OrderBy;
1819
use Statamic\Query\Scopes\Filter;
1920
use Statamic\Search\Index;
2021
use Statamic\Search\QueryBuilder as SearchQueryBuilder;
@@ -184,7 +185,7 @@ public function getIndexItems($request)
184185
private function applyOrderingToIndexQuery(Builder|SearchQueryBuilder $query, FilteredRequest $request): void
185186
{
186187
$query->when(method_exists($query, 'getQuery') && $query->getQuery()->orders, function ($query) use ($request) {
187-
if ($orderBy = $request->input('sort')) {
188+
if ($orderBy = OrderBy::column($request->input('sort'))) {
188189
// The stack selector always uses `title` as the default sort column, but
189190
// the "title field" for the model might be a different column, so we need to convert it.
190191
$sortColumn = $orderBy === 'title' ? $this->resource()->titleField() : $orderBy;

src/GraphQL/ResourceIndexQuery.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Statamic\GraphQL\Queries\Concerns\FiltersQuery;
99
use Statamic\GraphQL\Queries\Query;
1010
use Statamic\GraphQL\Types\JsonArgument;
11+
use Statamic\Query\OrderBy;
1112
use StatamicRadPack\Runway\Resource;
1213

1314
class ResourceIndexQuery extends Query
@@ -73,7 +74,9 @@ protected function sortQuery($query, $sorts): void
7374
[$sort, $order] = explode(' ', (string) $sort);
7475
}
7576

76-
$query = $query->orderBy($sort, $order);
77+
if ($sort = OrderBy::column($sort)) {
78+
$query = $query->orderBy($sort, $order);
79+
}
7780
}
7881
}
7982
}

src/Http/Controllers/CP/ResourceListingController.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Statamic\Http\Controllers\CP\CpController;
88
use Statamic\Http\Requests\FilteredRequest;
99
use Statamic\Query\Builder as BaseStatamicBuilder;
10+
use Statamic\Query\OrderBy;
1011
use Statamic\Query\Scopes\Filters\Concerns\QueriesFilters;
1112
use StatamicRadPack\Runway\Http\Resources\CP\Models;
1213
use StatamicRadPack\Runway\Resource;
@@ -31,11 +32,13 @@ public function index(FilteredRequest $request, Resource $resource)
3132

3233
$query = $this->applySearch($resource, $query, $searchQuery);
3334

34-
$query->when(method_exists($query, 'getQuery') && $query->getQuery()->orders, function ($query) use ($request, $resource) {
35-
if ($request->input('sort')) {
36-
$query->reorder($resource->model()->getColumnForField($request->input('sort')), $request->input('order'));
35+
$sortColumn = OrderBy::column($request->input('sort'), $resource->orderBy());
36+
37+
$query->when(method_exists($query, 'getQuery') && $query->getQuery()->orders, function ($query) use ($request, $resource, $sortColumn) {
38+
if ($request->input('sort') && $sortColumn) {
39+
$query->reorder($resource->model()->getColumnForField($sortColumn), $request->input('order'));
3740
}
38-
}, fn ($query) => $query->orderBy($resource->model()->getColumnForField($request->input('sort', $resource->orderBy())), $request->input('order', $resource->orderByDirection())));
41+
}, fn ($query) => $query->orderBy($resource->model()->getColumnForField($sortColumn), $request->input('order', $resource->orderByDirection())));
3942

4043
$activeFilterBadges = $this->queryFilters($query, $request->filters, [
4144
'resource' => $resource->handle(),

src/Tags/RunwayTag.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Illuminate\Support\Str;
88
use Statamic\Extensions\Pagination\LengthAwarePaginator;
99
use Statamic\Facades\Blink;
10+
use Statamic\Query\OrderBy;
1011
use Statamic\Tags\Tags;
1112
use StatamicRadPack\Runway\Exceptions\ResourceNotFound;
1213
use StatamicRadPack\Runway\Resource;
@@ -122,7 +123,9 @@ protected function query(): Builder
122123
$sortDirection = 'asc';
123124
}
124125

125-
$query->orderBy($this->resource->model()->getColumnForField($sortColumn), $sortDirection);
126+
if ($sortColumn = OrderBy::column($sortColumn)) {
127+
$query->orderBy($this->resource->model()->getColumnForField($sortColumn), $sortDirection);
128+
}
126129
}
127130

128131
return $query;

0 commit comments

Comments
 (0)