Skip to content

Commit 23ec092

Browse files
Add support for cursor pagination
1 parent b177fed commit 23ec092

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

src/Concerns/AppendsAttributesToResults.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Spatie\QueryBuilder\Concerns;
44

55
use Illuminate\Database\Eloquent\Model;
6+
use Illuminate\Pagination\Cursor;
67
use Illuminate\Support\Collection;
78
use Spatie\QueryBuilder\Exceptions\InvalidAppendQuery;
89

@@ -29,6 +30,13 @@ protected function addAppendsToResults(Collection $results)
2930
});
3031
}
3132

33+
protected function addAppendsToCursor( $results)
34+
{
35+
return $results->each(function (Model $result) {
36+
return $result->append($this->request->appends()->toArray());
37+
});
38+
}
39+
3240
protected function ensureAllAppendsExist()
3341
{
3442
$appends = $this->request->appends();

src/QueryBuilder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Spatie\QueryBuilder;
44

55
use ArrayAccess;
6+
use Illuminate\Contracts\Pagination\CursorPaginator;
67
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
78
use Illuminate\Database\Eloquent\Model;
89
use Illuminate\Database\Eloquent\Relations\Relation;
@@ -125,7 +126,7 @@ public function __call($name, $arguments)
125126
$this->addAppendsToResults($result);
126127
}
127128

128-
if ($result instanceof LengthAwarePaginator || $result instanceof Paginator) {
129+
if ($result instanceof LengthAwarePaginator || $result instanceof Paginator || $result instanceof CursorPaginator) {
129130
$this->addAppendsToResults(collect($result->items()));
130131
}
131132

tests/AppendTest.php

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,28 @@ public function it_can_append_paginates()
7373
$this->assertPaginateAttributeLoaded($models, 'FullName');
7474
}
7575

76+
/** @test */
77+
public function it_can_append_simple_paginates()
78+
{
79+
$models = $this
80+
->createQueryFromAppendRequest('FullName')
81+
->allowedAppends('FullName')
82+
->simplePaginate();
83+
84+
$this->assertPaginateAttributeLoaded($models, 'FullName');
85+
}
86+
87+
/** @test */
88+
public function it_can_append_cursor_paginates()
89+
{
90+
$models = $this
91+
->createQueryFromAppendRequest('FullName')
92+
->allowedAppends('FullName')
93+
->cursorPaginate();
94+
95+
$this->assertPaginateAttributeLoaded($models, 'FullName');
96+
}
97+
7698
/** @test */
7799
public function it_guards_against_invalid_appends()
78100
{
@@ -150,7 +172,11 @@ protected function assertCollectionAttributeLoaded(Collection $collection, strin
150172
$this->assertFalse($hasModelWithoutAttributeLoaded, "The `{$attribute}` attribute was expected but not loaded.");
151173
}
152174

153-
protected function assertPaginateAttributeLoaded(LengthAwarePaginator $collection, string $attribute)
175+
/**
176+
* @param \Illuminate\Pagination\LengthAwarePaginator|\Illuminate\Contracts\Pagination\Paginator $collection
177+
* @param string $attribute
178+
*/
179+
protected function assertPaginateAttributeLoaded($collection, string $attribute)
154180
{
155181
$hasModelWithoutAttributeLoaded = $collection
156182
->contains(function (Model $model) use ($attribute) {

0 commit comments

Comments
 (0)