I'm using laravel-5.4 pagination like the following:
public function index()
{
$jobs = Job::paginate(5);
return view('job.index', compact('jobs'));
}
In the view:
{{ $jobs->links() }}
There is a problem of generating two typical pages: /job
and /job?page=1
the two page has the same contents.
I want to do anything that removes the query string page
from the first page of the pagination.
I have tried the following:
if ($jobs->onFirstPage()){
$jobs->setPageName('');
}
But this corrupt the pagination, i.e the links of pages does not load correctly and the query string value remains for all pages.
The effective solution for this issue that I have found is to edit the pagination template.
First publish the pagination template from the vendors using the following command from the root of the project:
php artisan vendor:publish --tag=laravel-pagination
Now a file at resources/views/vendor/pagination/default.blade.php
should be found and it could be edited like the following using str_replace()
for the urls of each page and back navigation button:
<li><a href="{{str_replace('?page=1','',$paginator->previousPageUrl())}}" title="{{__('Previous')}}" rel="prev">{{$foxPrev}}</a></li>
and
<li><a href="{{str_replace('?page=1','',$url)}}">{{ $page }}</a></li>
A bug was found with ?page=10
so instead of using str_replace
we should using preg_replace
like the following:
<li><a href="{{preg_replace('/\?page=[1]$/','',$url)}}">{{ $page }}</a></li>
In case of using any customized name for the page number parameter other than page
, we could use the paginator getter for the $pageName property like the following in the pagination template:
<li><a href="{{preg_replace('/\?'.$paginator->getPageName().'=[1]$/','',$url)}}">{{ $page }}</a></li>
To know more about how to use more than one pagination on the same page or how to customize the page number parameter $pageName
from view, checkout this answer