Laravel:获取所有模型,说明它们的上一个关系具有一定条件

时间:2019-01-20 07:20:15

标签: laravel laravel-5 eloquent

我有两个模型Post和Comment,我想获得所有其最后评论为活动的帖子:

// Model Post
public function comments()
{
  return $this->hasMany('comments');
}

//Model Comment
public function post()
{
  return $this->belongsTo('post');
}

我尝试了此解决方案:

public function lastComment()
{
 return $this->hasOne('comment')->latest()
}

并在我的控制器中:

$postsWithLastActiveComment = Post::whereHas('lastComment', function($q){
  $q->where('active',1);
})->all();

但是在此解决方案中,如果上一条评论未激活,则会采用上一条评论

5 个答案:

答案 0 :(得分:1)

->latest()仅按created_at的顺序对帖子进行排序,以便仅获取您需要的最新评论->latest()->first()

答案 1 :(得分:1)

我认为下面的代码应该有效!

public function comments()
{
  return $this->hasMany('comments');
}

public function lastComment()
{
  return $this->comments()->latest()->first();
}

答案 2 :(得分:1)

我不确定是否还有另一种更简单的方法可以执行此操作,但是也许您可以使用子查询来尝试?

$lastComment = Comment::select('active')
    ->whereColumn('post_id', 'posts.id')
    ->latest()
    ->limit(1)
    ->getQuery();

$posts = Post::select('posts.*')
    ->selectSub($lastComment, 'last_comment_is_active')
    ->having('last_comment_is_active', 1)
    ->get();

答案 3 :(得分:1)

不是吗

$postsWithLastActiveComment = Post::whereHas('lastComment', function($q){
  $q->where('active',1);
})->all();

 $postsWithLastActiveComment = Post::whereHas('lastComment', function($q){
    $q->where('active',1);
 })->get();

答案 4 :(得分:0)

根据您的问题,帖子模型有很多评论。并且您要从帖子中获取评论,其中活跃状态为1,并且必须为最新ID

获取如下所示的最后一条评论

public function lastComment()
{
    return $this->hasOne('comment')->latest()->take(1);
}

获取所有具有posts的{​​{1}},如下所示

lastComment

并如下过滤$latestCommentPosts = Post::whereHas('lastComment')->get()

latestCommentPosts

或者,您也可以通过以下查询进行归档。

$latestCommentPosts->where('active', 1)->get()

例如,您获得的所有最新评论均为1。