Eloquent:hasNot with parameter

时间:2017-09-25 19:47:14

标签: laravel eloquent

我有以下雄辩的模型:

用户 | ID

发布 | ID

评论 | id | post_id | USER_ID

使用eloquent,如何获取特定用户尚未评论的所有帖子?

我到目前为止尝试过:

在模型发布

public function noCommentOf(User $user) {
    $this->hasNot('App\Comment')->commentOf($user);
}

在模型评论

public function commentOf($query, User $user) {
    return $query->where('user_id', '=', $user->id);
}

3 个答案:

答案 0 :(得分:8)

我这样做的方法是查询具有Post关系的whereDoesnthave模型。在您的控制器中:

public function getPostsWithoutCommenter(){
  $userId = 1; // Could be `$user`, `use($user)` and `$user->id`.
  $posts = \App\Post::whereDoesntHave("comments", function($subQuery) use($userId){
    $subQuery->where("user_id", "=", $userId);
  })->get();
}

这将假设comments模型上定义Post为:

public function comments(){
  return $this->hasMany(Comment::class);
}

基本上,如果与comments的检查的$userId关系返回Collection,则会从结果集中忽略它。

答案 1 :(得分:3)

发布模型

public function comments()
{
    return $this->hasMany(Comment::class)
}

然后获得帖子

$posts = Post:: whereDoesntHave('comments', function ($query) use ($userId) {
    $query->where('user_id', $userId);
});

获取没有评论的帖子

$posts = Post::has('comments', '=', 0)->get();

答案 2 :(得分:0)

我想:

$user->post()->leftJoin('comments', 'posts.id', '=', 'comments.post_id')->whereNull('comments.id');