Ich habe zwei Modelle Post und Kommentar, ich möchte alle Beiträge erhalten, deren letzter Kommentar aktiv ist:

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

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

Ich habe diese Lösung ausprobiert:

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

Und in meinem Controller:

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

Aber in dieser Lösung, wenn der letzte Kommentar nicht aktiv ist Vorheriger Kommentar wird genommen

3
Mostafa Abedi 20 Jän. 2019 im 10:20

5 Antworten

Beste Antwort

Ich bin mir nicht sicher, ob es einen anderen einfacheren Weg gibt, aber vielleicht können Sie es mit einer Unterabfrage versuchen?

$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();
1
Mozammil 20 Jän. 2019 im 09:06

->latest() bestellt die Beiträge nur bei created_at, um nur den neuesten Kommentar zu erhalten, den Sie benötigen ->latest()->first()

1
Josh 20 Jän. 2019 im 07:26

Ich denke, der folgende Code sollte funktionieren!

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

public function lastComment()
{
  return $this->comments()->latest()->first();
}
1
Goms 20 Jän. 2019 im 08:42

Sollte das nicht

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

Sein

 $postsWithLastActiveComment = Post::whereHas('lastComment', function($q){
    $q->where('active',1);
 })->get();
1
Iftikhar uddin 20 Jän. 2019 im 09:00

Entsprechend Ihrer Frage hat das Post-Modell viele Kommentare. Und Sie möchten den Kommentar von dem Beitrag erhalten, in dem aktiv ist und der die letzte ID sein muss .

Holen Sie sich den letzten Kommentar wie folgt

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

Holen Sie sich alle posts, die die lastComment wie folgt hatten

$latestCommentPosts = Post::whereHas('lastComment')->get()

Und filtern Sie das latestCommentPosts wie folgt

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

Sie können auch nach einer Abfrage wie der folgenden archivieren.

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

So haben Sie den neuesten Kommentar mit aktiv ist 1.

0
Set Kyar Wa Lar 20 Jän. 2019 im 09:09