Skip to content

Commit adf8285

Browse files
[10.x] Adds support for custom page names using the database engine (#728)
* [10.x] Adds support for custom page names using the database engine * [10.x] Adds support for custom page names using the database engine * [10.x] Adds support for custom page names using the database engine * formatting --------- Co-authored-by: Taylor Otwell <[email protected]>
1 parent 67bd2b1 commit adf8285

File tree

4 files changed

+110
-20
lines changed

4 files changed

+110
-20
lines changed

src/Builder.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Illuminate\Pagination\Paginator;
88
use Illuminate\Support\Traits\Macroable;
99
use Laravel\Scout\Contracts\PaginatesEloquentModels;
10+
use Laravel\Scout\Contracts\PaginatesEloquentModelsUsingDatabase;
1011

1112
class Builder
1213
{
@@ -317,6 +318,8 @@ public function simplePaginate($perPage = null, $pageName = 'page', $page = null
317318

318319
if ($engine instanceof PaginatesEloquentModels) {
319320
return $engine->simplePaginate($this, $perPage, $page)->appends('query', $this->query);
321+
} elseif ($engine instanceof PaginatesEloquentModelsUsingDatabase) {
322+
return $engine->simplePaginateUsingDatabase($this, $perPage, $pageName, $page)->appends('query', $this->query);
320323
}
321324

322325
$page = $page ?: Paginator::resolveCurrentPage($pageName);
@@ -354,6 +357,8 @@ public function simplePaginateRaw($perPage = null, $pageName = 'page', $page = n
354357

355358
if ($engine instanceof PaginatesEloquentModels) {
356359
return $engine->simplePaginate($this, $perPage, $page)->appends('query', $this->query);
360+
} elseif ($engine instanceof PaginatesEloquentModelsUsingDatabase) {
361+
return $engine->simplePaginateUsingDatabase($this, $perPage, $pageName, $page)->appends('query', $this->query);
357362
}
358363

359364
$page = $page ?: Paginator::resolveCurrentPage($pageName);
@@ -389,6 +394,8 @@ public function paginate($perPage = null, $pageName = 'page', $page = null)
389394

390395
if ($engine instanceof PaginatesEloquentModels) {
391396
return $engine->paginate($this, $perPage, $page)->appends('query', $this->query);
397+
} elseif ($engine instanceof PaginatesEloquentModelsUsingDatabase) {
398+
return $engine->paginateUsingDatabase($this, $perPage, $pageName, $page)->appends('query', $this->query);
392399
}
393400

394401
$page = $page ?: Paginator::resolveCurrentPage($pageName);
@@ -425,6 +432,8 @@ public function paginateRaw($perPage = null, $pageName = 'page', $page = null)
425432

426433
if ($engine instanceof PaginatesEloquentModels) {
427434
return $engine->paginate($this, $perPage, $page)->appends('query', $this->query);
435+
} elseif ($engine instanceof PaginatesEloquentModelsUsingDatabase) {
436+
return $engine->paginateUsingDatabase($this, $perPage, $pageName, $page)->appends('query', $this->query);
428437
}
429438

430439
$page = $page ?: Paginator::resolveCurrentPage($pageName);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Laravel\Scout\Contracts;
4+
5+
use Laravel\Scout\Builder;
6+
7+
interface PaginatesEloquentModelsUsingDatabase
8+
{
9+
/**
10+
* Paginate the given search on the engine.
11+
*
12+
* @param \Laravel\Scout\Builder $builder
13+
* @param int $perPage
14+
* @param string $pageName
15+
* @param int $page
16+
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
17+
*/
18+
public function paginateUsingDatabase(Builder $builder, $perPage, $pageName, $page);
19+
20+
/**
21+
* Paginate the given search on the engine using simple pagination.
22+
*
23+
* @param \Laravel\Scout\Builder $builder
24+
* @param int $perPage
25+
* @param string $pageName
26+
* @param int $page
27+
* @return \Illuminate\Contracts\Pagination\Paginator
28+
*/
29+
public function simplePaginateUsingDatabase(Builder $builder, $perPage, $pageName, $page);
30+
}

src/Engines/DatabaseEngine.php

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
use Laravel\Scout\Attributes\SearchUsingFullText;
99
use Laravel\Scout\Attributes\SearchUsingPrefix;
1010
use Laravel\Scout\Builder;
11-
use Laravel\Scout\Contracts\PaginatesEloquentModels;
11+
use Laravel\Scout\Contracts\PaginatesEloquentModelsUsingDatabase;
1212
use ReflectionMethod;
1313

14-
class DatabaseEngine extends Engine implements PaginatesEloquentModels
14+
class DatabaseEngine extends Engine implements PaginatesEloquentModelsUsingDatabase
1515
{
1616
/**
1717
* Create a new engine instance.
@@ -70,17 +70,31 @@ public function search(Builder $builder)
7070
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
7171
*/
7272
public function paginate(Builder $builder, $perPage, $page)
73+
{
74+
return $this->paginateUsingDatabase($builder, $perPage, 'page', $page);
75+
}
76+
77+
/**
78+
* Paginate the given search on the engine.
79+
*
80+
* @param \Laravel\Scout\Builder $builder
81+
* @param int $perPage
82+
* @param string $pageName
83+
* @param int $page
84+
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
85+
*/
86+
public function paginateUsingDatabase(Builder $builder, $perPage, $pageName, $page)
7387
{
7488
return $this->buildSearchQuery($builder)
75-
->when($builder->orders, function ($query) use ($builder) {
76-
foreach ($builder->orders as $order) {
77-
$query->orderBy($order['column'], $order['direction']);
78-
}
79-
})
80-
->when(! $this->getFullTextColumns($builder), function ($query) use ($builder) {
81-
$query->orderBy($builder->model->getKeyName(), 'desc');
82-
})
83-
->paginate($perPage, ['*'], 'page', $page);
89+
->when($builder->orders, function ($query) use ($builder) {
90+
foreach ($builder->orders as $order) {
91+
$query->orderBy($order['column'], $order['direction']);
92+
}
93+
})
94+
->when(! $this->getFullTextColumns($builder), function ($query) use ($builder) {
95+
$query->orderBy($builder->model->getKeyName(), 'desc');
96+
})
97+
->paginate($perPage, ['*'], $pageName, $page);
8498
}
8599

86100
/**
@@ -92,17 +106,30 @@ public function paginate(Builder $builder, $perPage, $page)
92106
* @return \Illuminate\Contracts\Pagination\Paginator
93107
*/
94108
public function simplePaginate(Builder $builder, $perPage, $page)
109+
{
110+
return $this->simplePaginateUsingDatabase($builder, $perPage, 'page', $page);
111+
}
112+
113+
/**
114+
* Paginate the given query into a simple paginator.
115+
*
116+
* @param int $perPage
117+
* @param string $pageName
118+
* @param int|null $page
119+
* @return \Illuminate\Contracts\Pagination\Paginator
120+
*/
121+
public function simplePaginateUsingDatabase(Builder $builder, $perPage, $pageName, $page)
95122
{
96123
return $this->buildSearchQuery($builder)
97-
->when($builder->orders, function ($query) use ($builder) {
98-
foreach ($builder->orders as $order) {
99-
$query->orderBy($order['column'], $order['direction']);
100-
}
101-
})
102-
->when(! $this->getFullTextColumns($builder), function ($query) use ($builder) {
103-
$query->orderBy($builder->model->getKeyName(), 'desc');
104-
})
105-
->simplePaginate($perPage, ['*'], 'page', $page);
124+
->when($builder->orders, function ($query) use ($builder) {
125+
foreach ($builder->orders as $order) {
126+
$query->orderBy($order['column'], $order['direction']);
127+
}
128+
})
129+
->when(! $this->getFullTextColumns($builder), function ($query) use ($builder) {
130+
$query->orderBy($builder->model->getKeyName(), 'desc');
131+
})
132+
->simplePaginate($perPage, ['*'], $pageName, $page);
106133
}
107134

108135
/**

tests/Feature/DatabaseEngineTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,30 @@ public function test_it_can_paginate_results()
110110
$this->assertCount(2, $models);
111111
}
112112

113+
public function test_it_can_paginate_using_a_custom_page_name()
114+
{
115+
$models = SearchableUserDatabaseModel::search('Taylor')->where('email', '[email protected]')->paginate();
116+
$this->assertStringContainsString('page=1', $models->url(1));
117+
118+
$models = SearchableUserDatabaseModel::search('Taylor')->where('email', '[email protected]')->paginate(pageName: 'foo');
119+
$this->assertStringContainsString('foo=1', $models->url(1));
120+
121+
$models = SearchableUserDatabaseModel::search('Taylor')->where('email', '[email protected]')->paginate(pageName: 'bar');
122+
$this->assertStringContainsString('bar=1', $models->url(1));
123+
}
124+
125+
public function test_it_can_simple_paginate_using_a_custom_page_name()
126+
{
127+
$models = SearchableUserDatabaseModel::search('Taylor')->where('email', '[email protected]')->simplePaginate();
128+
$this->assertStringContainsString('page=1', $models->url(1));
129+
130+
$models = SearchableUserDatabaseModel::search('Taylor')->where('email', '[email protected]')->simplePaginate(pageName: 'foo');
131+
$this->assertStringContainsString('foo=1', $models->url(1));
132+
133+
$models = SearchableUserDatabaseModel::search('Taylor')->where('email', '[email protected]')->simplePaginate(pageName: 'bar');
134+
$this->assertStringContainsString('bar=1', $models->url(1));
135+
}
136+
113137
public function test_limit_is_applied()
114138
{
115139
$models = SearchableUserDatabaseModel::search('laravel')->get();

0 commit comments

Comments
 (0)