Skip to content

Commit 06a4b80

Browse files
committed
Reverse aliases for column ordering with cursor pagination
1 parent ecf4c96 commit 06a4b80

File tree

3 files changed

+32
-3
lines changed

3 files changed

+32
-3
lines changed

src/Illuminate/Database/Concerns/BuildsQueries.php

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Container\Container;
66
use Illuminate\Database\MultipleRecordsFoundException;
7+
use Illuminate\Database\Eloquent\Builder;
78
use Illuminate\Database\RecordsNotFoundException;
89
use Illuminate\Pagination\CursorPaginator;
910
use Illuminate\Pagination\LengthAwarePaginator;
@@ -305,7 +306,9 @@ protected function paginateUsingCursor($perPage, $columns = ['*'], $cursorName =
305306
$builder->where(function (self $builder) use ($addCursorConditions, $cursor, $orders, $i) {
306307
['column' => $column, 'direction' => $direction] = $orders[$i];
307308

308-
$builder->where($column, $direction === 'asc' ? '>' : '<', $cursor->parameter($column));
309+
$original = $this->reverseColumnAliasingForCursorPagination($this, $column);
310+
311+
$builder->where($original, $direction === 'asc' ? '>' : '<', $cursor->parameter($column));
309312

310313
if ($i < $orders->count() - 1) {
311314
$builder->orWhere(function (self $builder) use ($addCursorConditions, $column, $i) {
@@ -327,6 +330,32 @@ protected function paginateUsingCursor($perPage, $columns = ['*'], $cursorName =
327330
]);
328331
}
329332

333+
/**
334+
* Reverse any aliases columns for column ordering.
335+
*
336+
* @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $builder
337+
* @param string $parameter
338+
* @return string
339+
*/
340+
protected function reverseColumnAliasingForCursorPagination($builder, string $parameter)
341+
{
342+
$columns = $builder instanceof Builder ? $builder->getQuery()->columns : $builder->columns;
343+
344+
if (! is_null($columns)) {
345+
foreach ($columns as $column) {
346+
if (stripos($column, ' as ') !== false) {
347+
[$original, $alias] = explode(' as ', $column);
348+
349+
if ($parameter === $alias) {
350+
return $original;
351+
}
352+
}
353+
}
354+
}
355+
356+
return $parameter;
357+
}
358+
330359
/**
331360
* Create a new length-aware paginator instance.
332361
*

src/Illuminate/Pagination/Cursor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Cursor implements Arrayable
1212
*
1313
* @var array
1414
*/
15-
protected $parameters;
15+
public $parameters;
1616

1717
/**
1818
* Determine whether the cursor points to the next or previous set of items.

tests/Database/DatabaseQueryBuilderTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4271,7 +4271,7 @@ protected function getMySqlBuilderWithProcessor()
42714271
}
42724272

42734273
/**
4274-
* @return m\MockInterface|Builder
4274+
* @return \Mockery\MockInterface|\Illuminate\Database\Query\Builder
42754275
*/
42764276
protected function getMockQueryBuilder()
42774277
{

0 commit comments

Comments
 (0)