You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:01:08