У меня есть две модели 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();
но в этом решении, если последний комментарий не активен, будет взят предыдущий комментарий






->latest() упорядочивает сообщения только через created_at, поэтому, чтобы получить только последний комментарий, вам нужен ->latest()->first().
Вызов неопределенного метода Illuminate\Database\Query\Builder::getRelated()
первый метод не разрешен в запросе отношений
Вы получаете ошибку getRelated, потому что ваше отношение комментариев является HasMany, а не HasOne (даже если вам нужен только один). Так что можно поставить: $this->hasMany('comments')->latest()->first()
Я думаю, что приведенный ниже код должен работать!
public function comments()
{
return $this->hasMany('comments');
}
public function lastComment()
{
return $this->comments()->latest()->first();
}
Я не уверен, есть ли другой более простой способ сделать это, но, может быть, вы можете попробовать его с помощью подзапроса?
$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();
Разве это не должно
$postsWithLastActiveComment = Post::whereHas('lastComment', function($q){
$q->where('active',1);
})->all();
быть
$postsWithLastActiveComment = Post::whereHas('lastComment', function($q){
$q->where('active',1);
})->get();
Согласно вашему вопросу, у модели Post много комментариев. А вы хотите получить комментарий к сообщению, где активен один и должен быть последним идентификатором.
Получите последний комментарий, как показано ниже.
public function lastComment()
{
return $this->hasOne('comment')->latest()->take(1);
}
Получите все posts, у которых есть lastComment, как показано ниже.
$latestCommentPosts = Post::whereHas('lastComment')->get()
И отфильтруйте latestCommentPosts, как показано ниже.
$latestCommentPosts->where('active', 1)->get()
Или вы также можете архивировать по одному запросу, как показано ниже.
Post::whereHas('comments', function($q) {
$q->where('active', 1);
})->get()
Таким образом, вы получили все последние комментарии с активным значением 1.
См. stackoverflow.com/a/50687657/4848587.