Laravel中怎么实现分页,手动创建的方式是怎样
Admin 2022-07-01 群英技术资讯 863 次浏览
这篇文章将为大家详细讲解有关“Laravel中怎么实现分页,手动创建的方式是怎样”的知识,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基于Laravel5.5 在项目实施过程中,需要对从接口中获取的数据(或者通过搜索工具查询出来的数据)进行分页
一、创建手动分页
在laravel自带的分页中,一般是通过数据库查询访问paginate()方法来达到分页的效果 ,like this:
class IndexControllerextends Controller
{
publicfunctionindex()
{
$person = DB::table('person')->paginate(15);
return view('index.pagTest',['person'=> $person]);
}
}
查看框架的分页源代码
#vender/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php
/**
* Paginate the given query.
*
* @param int $perPage
* @param array $columns
* @param string $pageName
* @param int|null $page
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*
* @throws \InvalidArgumentException
*/
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
{
$page = $page ?: Paginator::resolveCurrentPage($pageName);
$perPage = $perPage ?: $this->model->getPerPage();
$results = ($total = $this->toBase()->getCountForPagination())
? $this->forPage($page, $perPage)->get($columns)
: $this->model->newCollection();
return $this->paginator($results, $total, $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
]);
}
发现,分页用了 \Illuminate\Contracts\Pagination\LengthAwarePaginator 构造方法,查看这个构造方法
<?php
namespace Illuminate\Pagination;
use Countable;
use ArrayAccess;
use JsonSerializable;
use IteratorAggregate;
use Illuminate\Support\Collection;
use Illuminate\Support\HtmlString;
use Illuminate\Contracts\Support\Jsonable;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Pagination\LengthAwarePaginator as LengthAwarePaginatorContract;
class LengthAwarePaginator extends AbstractPaginator implements Arrayable, ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Jsonable, LengthAwarePaginatorContract
{
/**
* The total number of items before slicing.
*
* @var int
*/
protected $total;
/**
* The last available page.
*
* @var int
*/
protected $lastPage;
/**
* Create a new paginator instance.
*
* @param mixed $items
* @param int $total
* @param int $perPage
* @param int|null $currentPage
* @param array $options (path, query, fragment, pageName)
* @return void
*/
public function __construct($items, $total, $perPage, $currentPage = null, array $options = [])
{
foreach ($options as $key => $value) {
$this->{$key} = $value;
}
$this->total = $total;
$this->perPage = $perPage;
$this->lastPage = max((int) ceil($total / $perPage), 1);
$this->path = $this->path !== '/' ? rtrim($this->path, '/') : $this->path;
$this->currentPage = $this->setCurrentPage($currentPage, $this->pageName);
$this->items = $items instanceof Collection ? $items : Collection::make($items);
}
如果要实现手动分页,只需要使用这个构造方法,给定参数,就能达到分页的效果
贴代码:
public function setPage2(Request $request,$data,$prepage,$total){
#每页显示记录
$prePage = $prepage;
//$total =count($data);
$allitem = $prepage *100;
$total > $allitem ? $total = $allitem : $total;
if(isset($request->page)){
$current_page =intval($request->page);
$current_page =$current_page<=0?1:$current_page;
}else{
$current_page = 1;
}
#url操作
$url = $url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"];
if(strpos($url,'&page')) $url=str_replace('&page='.$request->page, '',$url);
# $data must be array
$item =array_slice($data,($current_page-1)*$prePage,$prePage);
$paginator = new LengthAwarePaginator($item,$total,$prePage,$current_page,[
'path'=>$url,
'pageName'=>'page'
]);
return $paginator;
}
($data 为需要进行分页的数据)
说明:
1、在考虑到代码的复用性,我将分页代码封装到app/Controllers/Controller.php中的一个方法里面,这样在其他控制器里只需要$this->setPage(Request $request,$data,$prepage,$total) 就能使用了,(前提:其他控制器继承了Controller.php)
2、分页的URL,因为我的项目的url一定会携带一个kw参数,所以我直接用str_replace替换"&page",如果是存在不携参分页的话,需要判断,到底是"?page"还是"&page"。(url的逻辑可以自己写)
#分页 php
$paginator = $this->setPage2($request,$data,25,$sum);
$data =$paginator->toArray()['data'];
在模板中:{{$paginator->render()}}即能输出分页HTML,样式如下:

二、自定义分页样式
在实际开发中,不希望用户在浏览时直接浏览最后几页,只想用户从前往后依次的浏览,如百度搜索分页,这时候,就想修改分页的样式,经过一个下午的奋战,贴出解决过程
在上一环节中,手动创建了分页,了解HTML的模板生成是render()方法,
#\Illuminate\Contracts\Pagination\LengthAwarePaginator
/**
* Render the paginator using the given view.
*
* @param string|null $view
* @param array $data
* @return \Illuminate\Support\HtmlString
*/
public function render($view = null, $data = [])
{
return new HtmlString(static::viewFactory()->make($view ?: static::$defaultView, array_merge($data, [
'paginator' => $this,
'elements' => $this->elements(),
]))->render());
}
经过思考,我们不去改laravel框架的源代码,可以通过重构render方法或者重新定义一个生成HTML模板的方法来实现自定义HTML模板
因为我们只需要自定义HTML模板,所以,可以创建一个文件,继承\Illuminate\Contracts\Pagination\LengthAwarePaginator 类
看代码:
<?php
namespace App\Helpers;
use Illuminate\Pagination\LengthAwarePaginator;
/**
* Created by PhpStorm.
* User: 1
* Date: 2018/4/9
* Time: 9:08
*/
class Newpage extends LengthAwarePaginator {
public $de_page = 10; //默认显示分页数
public $pageHtml;
public function newrender(){
if($this->hasPages())
{
return sprintf("<ul class='pagination'>%s %s %s</ul>",
$this->pre_page(),
$this->pages_num(),
$this->next_page()
);
}
}
#上一页
public function pre_page(){
if($this->currentPage == 1){
//dd($this->currentPage);
return "<li class='disabled'><span>《</span></li>";
}else{
$url = $this->path."&page=".($this->currentPage-1);
//dd($url);
return "<li><a href=".$url." rel="external nofollow" rel='prev'>《</a></li>";
}
}
#页码
public function pages_num(){
$pages = '';
if($this->currentPage <= 6){
for($i = 1; $i <= $this->de_page; $i++){
if($this->currentPage == $i){
$pages .= "<li class='active'><a href=".$this->path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &page=".$i.">".$i."</a></li>";
}else{
$pages .="<li><a href=".$this->path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &page=".$i.">".$i."</a></li>";
}
}
}else{
#当前页前边部分
for($i = 5; $i >=1 ; $i--){
$url =$this->currentPage-$i;
$pages .= "<li><a href=".$this->path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &page=".$url.">".$url."</a></li>";
}
#当前页
$pages .= "<li class='active'><span>".$this->currentPage."</span></li>";
#当前页后边部分
for($i = 1;$i < 5; $i++ ){
$nowpage =$this->currentPage+$i;
$pages .= "<li><a href=".$this->path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &page=".$nowpage.">".$nowpage."</a></li>";
}
}
return $pages;
}
#下一页
public function next_page(){
if($this->currentPage < $this->total){
$page =$this->currentPage+1;
return "<li><a href=".$this->path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &page=".$page." rel='next'><span>》</span></a></li>";
}else{
return "<li class='disabled'><span>》</span></li>";
}
}
}
我选择的方法是自定义新的方法生成HTML模板,模板中通过:{{$paginator->newrender()}}输出HTML
如果选择重构render()方法,只需要将上面的newrender()方法做一些小变动
public function render($view=null,$data=[]){
if($this->hasPages())
{
return sprintf("<ul class='pagination'>%s %s %s</ul>",
$this->pre_page(),
$this->pages_num(),
$this->next_page()
);
}
}
模板中通过:{{$paginator->render()}}输出HTML
最终效果如图:

注意:自定义HTML后因为新建了一个类继承了LengthAwarePaginator类,需要将第一步手动分页的方法中new LengthAwarePaginator 修改为 new Newpage 参数不变。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了PHP变量作用域(全局变量&局部变量)&global&static关键字用法,结合实例形式分析了PHP全局变量与局部变量的作用域,以及global、static关键字功能与使用技巧,需要的朋友可以参考下
今天小编就为大家分享一篇tp5 实现列表数据根据状态排序,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
我们知道在laravel中,无法使用$_SESSION,那么就只能用框架的session。不少新手朋友都有遇到laravel框架session失效的问题,那么要怎么样解决呢?下面我们一起来看看解决办法。
我们先来分析下规律。设定总金额为10元,有N个人随机领取:N=1第一个则红包金额=X元;N=2第二个为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数。第二个红包=10-第一个红包金额;N=3第三个红包1=0.01至9.99之间的某个随机数红包2=0.01至(10-红包1-0.01)的某个随机数红包3=10-红包1-红包2……于是我们得到
PHP MySQL分表思路,一张一亿的订单表,可以分成五张表,这样每张表就只有两千万数据,分担了原来一张表的压力,分表需要根据某个条件进行分,这里可以根据地区来分表,需要一个中间件来控制到底是去哪张表去找到自...
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008