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
相关产品推荐
相关产品推荐

