Laravel中with()关联查询结合paginate()失效问题求助
解决方案
你当前的实现方式存在问题:在with方法的关联闭包里直接使用paginate()会导致Eloquent无法正确处理关联加载,因为with期望关联查询返回集合而非分页实例,最终返回格式也不符合预期。
要实现每个部门附带分页后的会议列表及分页元数据,可先获取部门集合,再逐个处理每个部门的会议分页,拆分出会议数据和分页信息:
'auth' => [ 'user' => $request->user(), 'departments' => $request->user() ? $request->user()->departments()->get()->map(function ($department) { // 对当前部门的会议进行分页 $meetingsPaginated = $department->meetings()->paginate(10); // 给部门对象添加处理后的字段 return $department ->setAttribute('meetings', $meetingsPaginated->items()) // 提取当前页的会议数组 ->setAttribute('pagination', [ 'current_page' => $meetingsPaginated->currentPage(), 'last_page' => $meetingsPaginated->lastPage(), 'per_page' => $meetingsPaginated->perPage(), 'total' => $meetingsPaginated->total(), ]); }) : [], ],
关键说明
- 先通过
get()获取所有部门的基础数据,避免关联加载时的逻辑冲突 - 用
map()遍历每个部门,单独查询并分页其关联会议 - 通过
items()提取分页实例中的当前页会议数组,currentPage()、lastPage()等方法获取分页元数据,组装成你需要的格式
如果后续需要支持前端针对单个部门切换页码,可以给每个部门的分页请求添加独立的页码参数(比如page_dept_{id}),避免多个部门的页码参数冲突,示例如下:
// 假设前端传递的部门页码参数格式为 page_dept_1、page_dept_2... $page = $request->input('page_dept_' . $department->id, 1); $meetingsPaginated = $department->meetings()->paginate(10, ['*'], 'page_dept_' . $department->id);
内容的提问来源于stack exchange,提问作者Gerardo Topete
相关产品推荐
相关产品推荐

