Laravel仅为活跃用户选择帖子和评论

时间:2018-02-18 13:10:46

标签: laravel eloquent

我有三个模型,Users, Posts and Comments

用户表

id  username active
1   guyd        1
2   mohok       0
3   cotra       0

帖子表

id  post_content user_id
1   Hello         1
2   World         2
3   Foo           3

评论表

id post_id   user_id   commment_body
1       1       2       Great post
2       1       3       Totally disagree
3       2       1       Nice read
4       2       3       Wow
5       1       1       Thanks guys

我的帖子模型

public function latestComments($limit = 3)
  {
    return $this->hasMany(Comment::class)
      ->where('voided', '=', 0)
      ->with('user')
      ->join('users as comment_owner', 'comments.user_id', '=', 'comment_owner.id')
      ->where('comment_owner.active', '=', 1)
      ->orderByDesc('comments.updated_at')
      ->limit($limit);
  }

我的评论模型已

public function user()
  {
    return $this->belongsTo(User::class);
  }

我想只从active = 1的用户那里获取帖子和评论。我使用以下,但它给出了错误的结果。它正在为没有评论的帖子分配评论。

$posts = Post::orderBy('posts.created_at', 'DESC')
      ->with('user')
      ->with('latestComments')
      ->join('users as post_owner', 'posts.user_id', '=', 'post_owner.id')
      ->where('active', 1)
      ->paginate(5);

1 个答案:

答案 0 :(得分:2)

您应该使用whereHas()

Post::latest()
    ->with('user', 'latestComments')
    ->whereHas('user', function ($q) {
        $q->where('active', 1);
    })
    ->paginate(5);

如果您还想过滤评论:

->with(['user', 'latestComments' => function ($q) {
    $q->whereHas('user', function ($q) {
        $q->where('active', 1);
    });
}])