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

Laravel Eloquent获取单条记录时,无法筛选并排序关联评论求助

解决Post关联评论的筛选与排序问题

问题根源

你已经通过路由模型绑定获取了$post实例,但后续调用find($post)是错误的——find()方法需要传入主键ID(如数字),而非模型对象,这导致关联查询的约束没有正确应用到目标Post上。

正确实现方案

方案一:在已有Post实例上加载筛选后的关联

直接对注入的模型实例执行关联加载,同时添加筛选和排序逻辑:

// In Controller
public function show(Post $post)
{
    // 加载active状态的评论,并按创建时间倒序排序(可替换为你需要的排序字段)
    $post->load(['comments' => function($query) {
        $query->where('status', 'active')
              ->orderBy('created_at', 'desc');
    }]);

    return view('post.show', ['post' => $post]);
}

方案二:重新查询Post并包含筛选排序后的关联

如果需要确保获取数据库最新数据,可通过模型ID重新查询:

// In Controller
public function show(Post $post)
{
    $post = Post::with(['comments' => function($query) {
        $query->where('status', 'active')
              ->orderBy('created_at', 'desc');
    }])->findOrFail($post->id);

    return view('post.show', ['post' => $post]);
}

方案三:复用筛选逻辑(推荐)

在Post模型中定义专属关联方法,方便多处复用筛选和排序规则:

// 在Post模型中
public function activeComments()
{
    return $this->hasMany(Comment::class)
                ->where('status', 'active')
                ->orderBy('created_at', 'desc');
}

控制器中直接调用该关联:

// In Controller
public function show(Post $post)
{
    $post->load('activeComments');
    // 或查询时直接包含:$post = Post::with('activeComments')->findOrFail($post->id);

    return view('post.show', ['post' => $post]);
}

视图中可通过$post->activeComments直接获取筛选排序后的评论。

内容的提问来源于stack exchange,提问作者Marrs Green

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:42:07