Laravel如何预加载嵌套关联且避免子评论在顶层重复?
解决评论嵌套查询时顶层重复子评论的问题
问题原因
你之前的查询Comment::with('comments.comments')->get()会取出所有评论记录,包括parent_id不为null的子评论,这些子评论既会作为顶层结果返回,又会被包含在对应父评论的关联中,所以出现重复。
解决方案
只需要在查询时先筛选出parent_id为null的根评论,再预加载两级子评论即可:
直接在控制器中筛选
return Comment::whereNull('parent_id')->with('comments.comments')->get();
(可选)用模型作用域优化查询
在Comment模型中定义一个作用域,方便复用根评论的筛选逻辑:
class Comment extends Model { public function comments() { return $this->hasMany(self::class, 'parent_id'); } // 新增根评论作用域 public function scopeRoot($query) { return $query->whereNull('parent_id'); } }
之后在控制器中可以更简洁地调用:
return Comment::root()->with('comments.comments')->get();
效果说明
这样查询返回的结果只会包含parent_id为null的根评论,每个根评论下嵌套它的一级子评论,一级子评论下再嵌套二级子评论,完全符合你需要的两级嵌套结构,不会出现子评论在顶层重复的问题。
内容的提问来源于stack exchange,提问作者DeveloperX
相关产品推荐
相关产品推荐

