Laravel关联预加载实现分页报错:Collection::links方法不存在
问题描述
希望在Eloquent关联预加载中实现分页,但调用分页链接时触发错误:Method Illuminate\Database\Eloquent\Collection::links does not exist.,仅在视图中执行{{ $SubjectReport->reports->links() }}时出现该错误,移除这段代码后,页面可正常加载并显示paginate(2)设置的条目数。
已尝试的代码
控制器代码
$SubjectReport = Subject::with(['assesment.curriculumUnit', 'reports' => function($q) { $q->orderBy('id','DESC')->paginate(2); }])->where('id',2)->first(); return view('learner.assesment_reports',compact('SubjectReport'));
视图代码
@foreach ($SubjectReport->reports as $key => $report) <!-- 内容 --> @endforeach {{ $SubjectReport->reports->links() }}
解决方案
问题核心:预加载with()方法会自动将分页查询结果转为Eloquent Collection,而Collection类没有links()方法——只有LengthAwarePaginator实例才具备分页链接生成能力。
方法一:单独查询关联并分页
直接在控制器中拆分查询逻辑,将主模型和分页后的关联数据分别传递到视图:
// 查询主模型数据 $SubjectReport = Subject::with('assesment.curriculumUnit')->where('id',2)->first(); // 单独查询并分页关联的reports数据 $reports = $SubjectReport->reports()->orderBy('id','DESC')->paginate(2); return view('learner.assesment_reports', compact('SubjectReport', 'reports'));
视图中改为使用单独的分页变量:
@foreach ($reports as $key => $report) <!-- 内容 --> @endforeach {{ $reports->links() }}
方法二:延迟加载分页关联
如果想保留主模型的属性访问方式,可通过load()方法延迟加载并手动赋值分页实例:
$SubjectReport = Subject::with('assesment.curriculumUnit')->where('id',2)->first(); // 延迟加载关联并分页,手动覆盖模型属性 $SubjectReport->reports = $SubjectReport->reports()->orderBy('id','DESC')->paginate(2); return view('learner.assesment_reports', compact('SubjectReport'));
此时原视图代码无需修改,$SubjectReport->reports已成为LengthAwarePaginator实例,可正常调用links()方法。
内容的提问来源于stack exchange,提问作者Baby Babai
相关产品推荐
相关产品推荐

