Laravel: Получить все модели, которые имеют их последние отношения - PullRequest
0 голосов
/ 20 января 2019

У меня есть две модели 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 голосов
/ 20 января 2019

Согласно вашему вопросу, модель 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.

0 голосов
/ 20 января 2019

Разве это не должно

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

быть

 $postsWithLastActiveComment = Post::whereHas('lastComment', function($q){
    $q->where('active',1);
 })->get();
0 голосов
/ 20 января 2019

Я думаю, что код ниже должен работать!

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

public function lastComment()
{
  return $this->comments()->latest()->first();
}
0 голосов
/ 20 января 2019

Я не уверен, есть ли другой более простой способ сделать это, но, может быть, вы можете попробовать это с подзапросом?

$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();
0 голосов
/ 20 января 2019

->latest() упорядочивает сообщения только по create_at, чтобы получить только последний необходимый комментарий ->latest()->first()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...