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

Laravel8路由模型绑定场景下控制器show方法过滤已审核关联评论如何实现?

Laravel8 关联预加载过滤已审核评论解决方案

方法1:控制器层惰性预加载过滤(适配现有代码成本最低)

路由模型绑定已经查询出Post实例后,使用load方法手动预加载关联评论时添加审核条件,修改后控制器代码如下:

public function show(Post $post)
{  
    $post->load(['comments' => function ($query) {
        $query->where('approved', true);
    }]);
    return view('post', ['post' => $post]);
}

此时$post->comments返回的就只有approved=true的已审核评论,无需修改模型或模板代码。

方法2:模型层新增已审核评论关联(复用性更高)

如果多个场景都需要取已审核评论,可以直接在Post模型中新增独立的关联方法,避免重复写过滤条件:

Post模型新增代码:

// 原有comments关联保留,方便后台等特殊场景用
public function comments()
{
    return $this->morphMany(PostComment::class, 'commentable');
}

// 新增已审核评论专属关联
public function approvedComments()
{
    return $this->morphMany(PostComment::class, 'commentable')->where('approved', true);
}

控制器调用代码:

public function show(Post $post)
{  
    $post->load('approvedComments');
    return view('post', ['post' => $post]);
}

模板中直接调用$post->approvedComments即可获取已审核评论。

方法3:给Comment模型加全局作用域(全场景默认过滤)

如果所有前端场景默认都只需要展示已审核评论,可以给Comment模型加全局查询作用域,所有关联查询自动生效,无需修改控制器代码:

Comment模型新增代码:

protected static function booted()
{
    static::addGlobalScope('approved', function ($query) {
        $query->where('approved', true);
    });
}

如果后台需要查询未审核评论,手动移除作用域即可:

$allComments = Comment::withoutGlobalScope('approved')->get();

内容的提问来源于stack exchange,提问作者Maik Lowrey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:06:07