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

Laravel:如何获取指定用户评论过的所有Post?

嘿,这个需求在Laravel里其实很好实现,结合你说的模型关联关系,我给你整理了几种实用的方法:

先确认模型关联配置正确

首先得保证你的三个模型里的关联关系都配置到位,这是后续查询的基础:

  • User模型:
public function posts()
{
    return $this->hasMany(Post::class);
}

public function comments()
{
    return $this->hasMany(Comment::class);
}
  • Post模型:
public function user()
{
    return $this->belongsTo(User::class);
}

public function comments()
{
    return $this->hasMany(Comment::class);
}
  • Comment模型:
public function user()
{
    return $this->belongsTo(User::class);
}

public function post()
{
    return $this->belongsTo(Post::class);
}
方式一:直接用whereHas做数据库层面筛选(性能最优)

这种方式直接在数据库里过滤出有指定用户评论的帖子,避免了内存中处理数据,适合数据量较大的场景,还能自动去重:

// 假设$userId是你要查询的用户ID
$commentedPosts = Post::whereHas('comments', function ($query) use ($userId) {
    $query->where('user_id', $userId);
})->get();
方式二:通过用户的评论关联获取帖子(直观易懂)

如果你想从User模型出发查询,也可以先拿到用户的所有评论,再关联到对应的帖子,最后去重:

$user = User::find($userId);
// 这里用unique()避免同一个帖子被用户多次评论后重复出现
$commentedPosts = $user->comments()->with('post')->get()->pluck('post')->unique();
方式三:在User模型中定义专属关联(复用性强)

如果这个查询你需要频繁使用,建议直接在User模型里定义一个commentedPosts关联,之后调用就非常简洁:

// 在User模型中添加
public function commentedPosts()
{
    // 因为用户和帖子通过comments表间接形成多对多关系,所以用belongsToMany
    return $this->belongsToMany(Post::class, 'comments')
                ->distinct(); // 确保每个帖子只返回一次
}

// 使用的时候直接调用
$user = User::find($userId);
$commentedPosts = $user->commentedPosts()->get();

注意事项

如果你的数据库表没有使用Laravel默认的外键命名(比如comments表的用户外键不是user_id,帖子外键不是post_id),需要在关联里手动指定:

// 示例:假设comments表用户外键是author_id,帖子外键是article_id
public function commentedPosts()
{
    return $this->belongsToMany(Post::class, 'comments', 'author_id', 'article_id')
                ->distinct();
}

内容的提问来源于stack exchange,提问作者Saeed Vaziry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:13:39