手记

Laravel中同一页面下多个以上的列表需要分页的方法

    期初,最开始我遇到了这个问题,在网上查询了很久都没有答案,于是就静下心来看看laravel的整个分页的流程。

首先我们都是使用paginate()这个方法生成分页,在view页面中使用render()这个方法生成分页链接的,感觉laravel太好用了,都不用自己写分页及一些链接的处理。当我在页面增加两个列表的分页的时候问题出现了,我点击其中一个列表的分页链接的时候,另一个列表的数据都发生了变化,原来是都是用了同一个page,比如你的链接是user?page=1,两个列表都是用了这个page命名就会发生冲突。于是乎我网上搜索了一番,找到了可以使用setPageName()方法为不同的列表分页设定自己的pagename,我非常高兴的设定了这个值,也很有效的改变了这个原始的page为两个不同的命名,例如:user?upage=1user?ipage=1,我想这下问题该解决了吧!但是要命的来了,点击分页链接的时候内容并没有变化,怎么修改了之后还是没有用......

做到这个的时候感觉非常的恼火,也感觉到无助,不知怎么办。于是乎我静下心来看看laravel的分页是怎么一个流程,我于是沿着paginate()方法查询到在vender文件夹中找vender\laravel\framework\src\Illuminate\Pagination\Paginator目录下的Paginator.php,在里面看看各个方法之间的关系,寻源而上发现$pageName这个变量在LengthAwarePaginator.php中已被setPageName()方法所改变,但是为何url改变而内容却没有任何变化,我想那应该是url链接的数据不正确。

接着我发现![LengthAwarePaginator][1].php中找到构造函数中options数组中存在pageName参数,这不就是我设定的pageName变量么,我与是打印出来看看,打印出来还是page这个命名,于是我再向上查找,找到了Eloquent/Builder.php,看到里面有paginate这个方法,瞬间恍然大悟,setPageName()这个方法并没有改变查询数据的pagename,所以setPageName()只是在子类中的设置pagename的变化,而向上一层真正生成的分页中没有作用,于是我就在控制器中将paginate()方法增加两个参数,将第三个参数写成将要输入的pagename,再回到页面看看效果,结果大功告成!

修改方法:
例如:你使用的是User::paginate(2),这里只有一个参数,Builder.php里面有4个参数,第二个参数这里不做解释,第三个参数就是我们自定义的pagename,于是修改为User::paginate(2, '[*]', 'uPage');这就会将默认的page修改为uPage,并且页面的链接也正确!

Builder.php中的paginate方法:

12人推荐
随时随地看视频
慕课网APP

热门评论

抱歉啊!后面的那个实例疏忽写错了,第二个参数应该是

User::paginate(2, ['*'], 'uPage');


抱歉啊!后面的那个实例疏忽写错了,第二个参数应该是

User::paginate(2, ['*'], 'uPage');


这么好的文采建议去当作家

查看全部评论