如何在Blade视图中合并数组?分页场景问题求助
解决Laravel中合并Ticket与Answers并实现分页的问题
我懂你现在碰到的麻烦:当$answers启用分页后,原来先遍历回复再显示工单的逻辑直接乱套了——分页后的$answers只是当前页的内容,工单却每次都重复显示,而且分页链接只针对回复,完全达不到你想要的「合并内容统一分页」的效果。
下面是具体的解决步骤,分控制器处理和视图渲染两部分:
1. 在控制器中合并集合并手动创建分页
因为$ticket是单个Eloquent模型,$answers是查询结果,我们需要先把它们合并成一个统一的集合,再转成分页实例:
// 假设你原本获取$ticket和$answers的代码是这样的 $ticket = Ticket::find($id); $answers = Answer::where('ticket_id', $ticket->id)->orderBy('created_at', 'asc'); // 1. 合并工单与回复:把工单加到回复集合的开头(如果需要按时间排序可以调整顺序) $combinedItems = $answers->get()->prepend($ticket); // 2. 按时间排序(可选,根据你的业务需求调整排序字段) $combinedItems = $combinedItems->sortBy('created_at'); // 3. 手动创建分页实例 $perPage = 10; // 每页显示的内容数量 $currentPage = request()->input('page', 1); $offset = ($currentPage - 1) * $perPage; // 截取当前页的内容 $currentPageItems = $combinedItems->slice($offset, $perPage)->values(); // 创建支持分页链接的LengthAwarePaginator实例 $paginatedItems = new \Illuminate\Pagination\LengthAwarePaginator( $currentPageItems, $combinedItems->count(), $perPage, $currentPage, ['path' => request()->url(), 'query' => request()->query()] ); // 把分页后的集合传到视图 return view('your-view-name', ['items' => $paginatedItems]);
2. 在Blade视图中统一渲染内容
现在视图里只需要循环分页后的$items,不管是工单还是回复,都用相同的模板渲染,最后调用分页链接即可:
@foreach($items as $item) <div class="description">{{ $item->desc }}</div> <div class="author">{{ $item->user->name }}</div> @endforeach {!! $items->render() !!}
为什么原来的代码会出问题?
你原来的逻辑是先遍历分页后的回复,再单独显示工单,最后调用回复的分页链接——这会导致每个分页页面都重复显示工单,而且分页只针对回复,完全没有把工单纳入分页体系里。合并后分页的核心就是把工单和回复放到同一个集合里,让分页器把它们当成整体处理。
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

