如何用单查询实现两个带筛选分页标签页的数据加载?
问题:能否通过单次查询实现两个标签页的分页数据?
原本页面只有一个标签页,用以下代码实现分页展示:
$data = MyModel::paginate(100);
现在要拆分到两个带不同筛选条件的标签页,初始筛选代码如下:
$tab_1_data = MyModel::where('column', 'some_value'); $tab_2_data = MyModel::where('column', 'some_other_value');
请问能不能通过单次查询获取两个标签页的分页数据?还是必须执行两次分页查询:
$tab_1_data = MyModel::where('column', 'some_value')->paginate(); $tab_2_data = MyModel::where('column', 'some_other_value')->paginate();
担心两次查询会拖慢页面加载速度。
回答
没办法通过单次查询同时获取两个标签页的分页数据,必须分开执行两次分页查询,原因如下:
- 分页的核心逻辑是针对特定筛选条件做总条数统计+当前页数据截取,两个标签页的筛选条件不同,对应的总条数、数据范围完全独立,没法合并成一次SQL完成。
- Laravel的
paginate()方法本身会生成两条SQL:一条count()统计符合条件的总记录数,另一条limit+offset获取当前页数据,两个标签页的这两组SQL都无法复用。
不过可以通过以下方式优化页面加载速度:
- 给筛选字段
column添加数据库索引,大幅提升两次查询的执行效率 - 如果数据不是强实时需求,可以给两个分页结果添加缓存,避免重复查询
- 若单标签页数据量极大,可考虑用
cursor()替代paginate(),减少偏移量带来的性能损耗
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

