Laravel hasMany关联如何为每条记录限制关联数量并配合分页查询
问题根源
你当前在预加载闭包里加take(3)的写法,是对所有回复的关联查询做全局行数限制,所以Laravel只会查出最新的3条回复,只会分配到对应父评论下,无法实现每条父评论各返回3条的需求。
解决方案
方案1:Laravel 8.42 及以上版本(原生支持,推荐)
该版本开始官方已经内置「单条父模型关联结果限制」能力,直接修改关联定义即可:
// PostComments 模型中修改关联方法 public function CommentReplay(){ return $this->hasMany('App\PostCommentReplies','comment_id','id') ->orderBy('id','DESC') ->take(3); }
查询时不需要再加闭包限制,直接写:
PostComments::select('post_comments.*') ->with(['users','CommentReplay']) ->orderBy('id','DESC') ->paginate(10);
方案2:低版本 Laravel 兼容方案
如果使用的是8.42以下版本,可以通过第三方扩展包快速实现该能力:
- 安装扩展包
composer require staudenmeir/eloquent-eager-limit - 在
PostComments和PostCommentReplies两个模型中引入对应 trait:
use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; class PostComments extends Model { use HasEagerLimit; // 原有模型逻辑 }
use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; class PostCommentReplies extends Model { use HasEagerLimit; // 原有模型逻辑 }
- 后续关联定义和查询写法和方案1完全一致即可。
注意事项
- 如果你要在关联查询的
select里指定字段,必须要包含外键字段comment_id,否则关联数据无法正常挂载到父评论上。 - 关联方法名建议遵循Laravel开发规范,改为小驼峰写法
commentReplies更符合惯例。
内容的提问来源于stack exchange,提问作者Lakhan
相关产品推荐
相关产品推荐

