12
12
use ComplexHeart \Domain \Criteria \Page ;
13
13
use ComplexHeart \Infrastructure \Laravel \Persistence \Contracts \IlluminateCriteriaParser ;
14
14
use Illuminate \Contracts \Database \Query \Builder ;
15
+ use Illuminate \Contracts \Pagination \LengthAwarePaginator ;
15
16
16
17
/**
17
18
* Class EloquentCriteriaParser
18
19
*
19
20
* @author Unay Santisteban <[email protected] >
20
21
* @package ComplexHeart\Infrastructure\Laravel\Persistence
21
22
*/
22
- class EloquentCriteriaParser implements IlluminateCriteriaParser
23
+ readonly class EloquentCriteriaParser implements IlluminateCriteriaParser
23
24
{
24
25
/**
25
26
* DefaultCriteriaParser constructor.
26
27
*
27
28
* @param array<string, string> $filterAttributes
28
29
*/
29
- public function __construct (private readonly array $ filterAttributes = [])
30
- {
30
+ public function __construct (
31
+ private array $ filterAttributes = [],
32
+ private bool $ paginator = false
33
+ ) {
31
34
}
32
35
33
36
/**
@@ -63,9 +66,9 @@ private function filterAttribute(string $fieldAttribute): string
63
66
*
64
67
* @param Builder $builder
65
68
* @param Criteria $criteria
66
- * @return Builder
69
+ * @return Builder|LengthAwarePaginator
67
70
*/
68
- public function applyCriteria (Builder $ builder , Criteria $ criteria ): Builder
71
+ public function applyCriteria (Builder $ builder , Criteria $ criteria ): Builder | LengthAwarePaginator
69
72
{
70
73
$ builder = $ this ->applyFilterGroups ($ builder , $ criteria ->groups ());
71
74
$ builder = $ this ->applyOrdering ($ builder , $ criteria ->order ());
@@ -144,10 +147,6 @@ private function applyFilter(Builder $builder, Filter $filter): Builder
144
147
145
148
/**
146
149
* Apply the ordering settings into the given QueryBuilder.
147
- *
148
- * @param Builder $builder
149
- * @param Order $ordering
150
- * @return Builder
151
150
*/
152
151
private function applyOrdering (Builder $ builder , Order $ ordering ): Builder
153
152
{
@@ -167,11 +166,18 @@ private function applyOrdering(Builder $builder, Order $ordering): Builder
167
166
*
168
167
* @param Builder $builder
169
168
* @param Page $page
170
- * @return Builder
169
+ * @return Builder|LengthAwarePaginator
171
170
*/
172
- private function applyPage (Builder $ builder , Page $ page ): Builder
171
+ private function applyPage (Builder $ builder , Page $ page ): Builder | LengthAwarePaginator
173
172
{
174
173
if ($ page ->limit () > 0 ) {
174
+ if ($ this ->paginator ) {
175
+ return $ builder ->paginate (
176
+ perPage: $ page ->limit (),
177
+ page: ($ page ->offset () / $ page ->limit ()) + 1 ,
178
+ );
179
+ }
180
+
175
181
$ builder = $ builder ->limit ($ page ->limit ());
176
182
$ builder = $ builder ->offset ($ page ->offset ());
177
183
}
0 commit comments