如何对Laravel中with()关联查询返回的answers数据进行分页?
如何在Laravel的
with()中对关联模型进行分页 在Laravel里要实现预加载关联模型同时对关联数据分页,有两种很实用的方案,我给你详细拆解下:
方法一:借助with()的闭包自定义关联查询并分页
你可以直接在with()的闭包中对关联的answers执行分页操作,这种方式会把分页实例直接绑定到主模型的关联属性上:
$questions = Questions::with(['answers' => function ($query) { // 可按需添加排序、筛选条件,这里按创建时间倒序分页,每页10条 return $query->orderBy('created_at', 'desc')->paginate(10); }])->where('id', $request->id)->first();
小提示:因为是按唯一
id查询,用first()替代get()更合理,直接返回单个模型而非集合。
此时$questions->answers是一个LengthAwarePaginator实例,和直接调用paginate()得到的分页对象完全一致,能正常使用links()、currentPage()等分页方法。
方法二:先获取主模型,再手动加载分页后的关联
如果预加载的方式不够灵活,也可以分步操作:先拿到主模型,再手动加载分页后的关联数据:
// 第一步:获取指定问题 $question = Questions::where('id', $request->id)->first(); // 第二步:手动加载并设置分页后的answers关联 $question->setRelation( 'answers', $question->answers()->orderBy('created_at', 'desc')->paginate(10) );
这种方式适合需要在加载关联前做额外逻辑处理的场景,比如根据不同业务动态调整分页参数。
额外注意点
分页后的关联属性是分页实例而非普通Eloquent集合,不过在视图中直接循环$question->answers即可,Laravel会自动处理为遍历分页结果的items()集合。
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

