能否将两个相似的Eloquent查询合并为单个查询?
简化相似查询的可行方案
方案1:复用查询构造器减少重复代码
把两个查询的公共逻辑抽出来,再分别追加条件,既能减少重复代码,也能让逻辑更清晰:
$document = Document::findOrFail($id); // 提取公共查询部分 $baseQuery = Document::forExplore()->latest(); // 基于公共查询生成两个结果 $other_document = $baseQuery->paginate(4); $author_document = $baseQuery->where('user_id', $document->user_id)->paginate(4); return view('document.show', compact('document','other_document','author_document'));
方案2:合并结果为单个变量(需注意分页问题)
如果确实要把两个查询的结果合并到一个变量里,要注意paginate()返回的是分页对象,不能直接合并。可以先获取集合再处理:
$document = Document::findOrFail($id); $baseQuery = Document::forExplore()->latest(); // 获取两个查询的数据集 $otherDocs = $baseQuery->get(); $authorDocs = $baseQuery->where('user_id', $document->user_id)->get(); // 合并集合并去重(防止当前文档重复出现) $combinedDocuments = $otherDocs->merge($authorDocs)->unique('id'); // 手动处理分页(需要引入Illuminate\Pagination\LengthAwarePaginator) $perPage = 8; $currentPage = request()->get('page', 1); $combinedPaginated = new LengthAwarePaginator( $combinedDocuments->forPage($currentPage, $perPage), $combinedDocuments->count(), $perPage, $currentPage, ['path' => request()->url()] ); return view('document.show', compact('document','combinedPaginated'));
提示:方案2如果数据量较大,直接用
get()拉取全量数据会影响性能,优先推荐方案1。
内容的提问来源于stack exchange,提问作者Roodey21
相关产品推荐
相关产品推荐

