1212use ComplexHeart \Domain \Criteria \Page ;
1313use ComplexHeart \Infrastructure \Laravel \Persistence \Contracts \IlluminateCriteriaParser ;
1414use Illuminate \Contracts \Database \Query \Builder ;
15+ use Illuminate \Contracts \Pagination \LengthAwarePaginator ;
1516
1617/**
1718 * Class EloquentCriteriaParser
1819 *
1920 * @author Unay Santisteban <[email protected] > 2021 * @package ComplexHeart\Infrastructure\Laravel\Persistence
2122 */
22- class EloquentCriteriaParser implements IlluminateCriteriaParser
23+ readonly class EloquentCriteriaParser implements IlluminateCriteriaParser
2324{
2425 /**
2526 * DefaultCriteriaParser constructor.
2627 *
2728 * @param array<string, string> $filterAttributes
2829 */
29- public function __construct (private readonly array $ filterAttributes = [])
30- {
30+ public function __construct (
31+ private array $ filterAttributes = [],
32+ private bool $ paginator = false
33+ ) {
3134 }
3235
3336 /**
@@ -63,9 +66,9 @@ private function filterAttribute(string $fieldAttribute): string
6366 *
6467 * @param Builder $builder
6568 * @param Criteria $criteria
66- * @return Builder
69+ * @return Builder|LengthAwarePaginator
6770 */
68- public function applyCriteria (Builder $ builder , Criteria $ criteria ): Builder
71+ public function applyCriteria (Builder $ builder , Criteria $ criteria ): Builder | LengthAwarePaginator
6972 {
7073 $ builder = $ this ->applyFilterGroups ($ builder , $ criteria ->groups ());
7174 $ builder = $ this ->applyOrdering ($ builder , $ criteria ->order ());
@@ -144,10 +147,6 @@ private function applyFilter(Builder $builder, Filter $filter): Builder
144147
145148 /**
146149 * Apply the ordering settings into the given QueryBuilder.
147- *
148- * @param Builder $builder
149- * @param Order $ordering
150- * @return Builder
151150 */
152151 private function applyOrdering (Builder $ builder , Order $ ordering ): Builder
153152 {
@@ -167,11 +166,18 @@ private function applyOrdering(Builder $builder, Order $ordering): Builder
167166 *
168167 * @param Builder $builder
169168 * @param Page $page
170- * @return Builder
169+ * @return Builder|LengthAwarePaginator
171170 */
172- private function applyPage (Builder $ builder , Page $ page ): Builder
171+ private function applyPage (Builder $ builder , Page $ page ): Builder | LengthAwarePaginator
173172 {
174173 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+
175181 $ builder = $ builder ->limit ($ page ->limit ());
176182 $ builder = $ builder ->offset ($ page ->offset ());
177183 }
0 commit comments