From 751fe5cf066c6daa7a9fb6f45de5cd6e7678a257 Mon Sep 17 00:00:00 2001 From: MostafaRabia Date: Thu, 3 Sep 2020 20:59:43 +0200 Subject: [PATCH 1/3] Fix desc order in paginate. Order desc was sorting per page, not like real pagination, now it's working with me well. --- src/Engines/TNTSearchEngine.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Engines/TNTSearchEngine.php b/src/Engines/TNTSearchEngine.php index 57d07e6..10deb76 100644 --- a/src/Engines/TNTSearchEngine.php +++ b/src/Engines/TNTSearchEngine.php @@ -124,6 +124,10 @@ public function paginate(Builder $builder, $perPage, $page) if (empty($chunks)) { return $results; } + + if ($this->builder->orders[0]['direction']==="desc"){ + rsort($chunks); + } if (array_key_exists($page - 1, $chunks)) { $results['ids'] = $chunks[$page - 1]; From 84dea6d1201e2c7bd3417b9537e2a0c68a6412fb Mon Sep 17 00:00:00 2001 From: MostafaRabia Date: Sat, 12 Sep 2020 06:07:44 +0200 Subject: [PATCH 2/3] Update TNTSearchEngine.php That's better, the perv if the paginate 20 and last page has 4 results won't get them. --- src/Engines/TNTSearchEngine.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Engines/TNTSearchEngine.php b/src/Engines/TNTSearchEngine.php index 10deb76..e504fbf 100644 --- a/src/Engines/TNTSearchEngine.php +++ b/src/Engines/TNTSearchEngine.php @@ -119,15 +119,16 @@ public function paginate(Builder $builder, $perPage, $page) $results['hits'] = $filtered->count(); - $chunks = array_chunk($filtered->toArray(), $perPage); + $filtered_array = $filtered->toArray(); + if ($this->builder->orders[0]['direction']=="desc"){ + rsort($filtered_array); + } + + $chunks = array_chunk($filtered_array, $perPage); if (empty($chunks)) { return $results; } - - if ($this->builder->orders[0]['direction']==="desc"){ - rsort($chunks); - } if (array_key_exists($page - 1, $chunks)) { $results['ids'] = $chunks[$page - 1]; From cf3b4883c952df364b4ab678aa593508106a6b69 Mon Sep 17 00:00:00 2001 From: MostafaRabia Date: Thu, 17 Sep 2020 21:54:22 +0200 Subject: [PATCH 3/3] Faced problem in laravel 8 while order pagination There is changes i don't understand it, but it works to me like in charm, get all IDs then order them in paginate, no more "rsort" or something else. But i don't understand "keyBy($model->getKeyName())", if my pagination IDs is: 10 9 3 By "keyBy($model->getKeyName());" turns to: 3 9 10 So i deleted it and the: return $models->newCollection($results['ids'])->map(function ($hit) use ($models) { if (isset($models[$hit])) { return $models[$hit]; } })->filter()->values(); too, and it's working now, working too if your pagination not in default name "page". --- src/Engines/TNTSearchEngine.php | 38 ++++++++++++++------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/Engines/TNTSearchEngine.php b/src/Engines/TNTSearchEngine.php index e504fbf..acd40a3 100644 --- a/src/Engines/TNTSearchEngine.php +++ b/src/Engines/TNTSearchEngine.php @@ -119,22 +119,20 @@ public function paginate(Builder $builder, $perPage, $page) $results['hits'] = $filtered->count(); - $filtered_array = $filtered->toArray(); - if ($this->builder->orders[0]['direction']=="desc"){ - rsort($filtered_array); - } - - $chunks = array_chunk($filtered_array, $perPage); + /*$chunks = array_chunk($filtered->toArray(), $perPage); if (empty($chunks)) { return $results; - } + }*/ - if (array_key_exists($page - 1, $chunks)) { + /*if (array_key_exists($page - 1, $chunks)) { $results['ids'] = $chunks[$page - 1]; } else { $results['ids'] = []; - } + }*/ + + $results['per_page'] = $perPage; + $results['page'] = $page; return $results; } @@ -200,21 +198,17 @@ public function map(Builder $builder, $results, $model) call_user_func($this->builder->queryCallback, $builder); } - $models = $builder->whereIn( - $model->getQualifiedKeyName(), $keys - )->get()->keyBy($model->getKeyName()); - - // sort models by user choice - if (!empty($this->builder->orders)) { - return $models->values(); + if (array_key_exists('per_page',$results)){ + $models = $builder->whereIn( + $model->getQualifiedKeyName(), $keys + )->paginate($results['per_page'],['*'],'page',$results['page']); + }else{ + $models = $builder->whereIn( + $model->getQualifiedKeyName(), $keys + )->get(); } - // sort models by tnt search result set - return $model->newCollection($results['ids'])->map(function ($hit) use ($models) { - if (isset($models[$hit])) { - return $models[$hit]; - } - })->filter()->values(); + return $models; } /**