Laravel多类别数据的分页查询与合并实现需求
解决Laravel多类型数据合并分页问题
最优方案:直接用whereIn+paginate
如果三类数据仅QUESTION_TYPE不同,无其他独立查询条件,直接用whereIn包含目标类型后调用paginate即可,数据库层面直接处理分页,性能最优:
// 控制器代码 $questionTypes = ['类型1', '类型2', '类型3']; // 替换为你的实际类型值 $questionChecks = QuestionCheck::whereIn('QUESTION_TYPE', $questionTypes) ->orderBy('created_at', 'desc') // 按需添加排序规则 ->paginate(10); // 10为每页条数,可按需修改 return view('你的视图名', compact('questionChecks'));
视图中直接使用Laravel自带分页渲染:
{{ $questionChecks->links() }}
进阶方案:多查询union后分页
如果三类数据各自有不同查询条件(比如除类型外还有其他筛选规则),可以用union合并三个查询构造器,再统一分页:
// 分别定义三类数据的查询构造器 $queryType1 = QuestionCheck::where('QUESTION_TYPE', '类型1') ->where('status', 1); // 示例额外条件 $queryType2 = QuestionCheck::where('QUESTION_TYPE', '类型2') ->where('created_at', '>=', now()->subWeek()); // 示例额外条件 $queryType3 = QuestionCheck::where('QUESTION_TYPE', '类型3') ->where('is_active', true); // 示例额外条件 // 合并查询并分页 $questionChecks = $queryType1->union($queryType2)->union($queryType3) ->orderBy('created_at', 'desc') ->paginate(10); return view('你的视图名', compact('questionChecks'));
这种方式依然是数据库层面分页,性能远优于手动合并后分页。
兜底方案:手动合并集合后封装分页实例
如果前两种方案不适用(比如三类数据来自不同关联查询,无法用union合并),可以手动合并查询结果,再封装成Laravel的分页对象:
use Illuminate\Pagination\LengthAwarePaginator; $page = request()->get('page', 1); $perPage = 10; // 获取三类数据的集合 $collection1 = QuestionCheck::where('QUESTION_TYPE', '类型1')->get(); $collection2 = QuestionCheck::where('QUESTION_TYPE', '类型2')->get(); $collection3 = QuestionCheck::where('QUESTION_TYPE', '类型3')->get(); // 合并集合 $mergedCollection = $collection1->merge($collection2)->merge($collection3); // 按页码截取数据 $slicedData = $mergedCollection->slice(($page - 1) * $perPage, $perPage)->values(); // 封装成分页对象 $questionChecks = new LengthAwarePaginator( $slicedData, $mergedCollection->count(), $perPage, $page, ['path' => LengthAwarePaginator::resolveCurrentPath()] ); return view('你的视图名', compact('questionChecks'));
注意:该方案会先查询所有数据再分页,数据量大时性能会受影响,优先选用前两种方案。
内容的提问来源于stack exchange,提问作者BnCrshr
相关产品推荐
相关产品推荐

