3
votes

Laravel: Obtenez tous les modèles que leur dernière relation a une condition

J'ai deux modèles de publication et de commentaire, je souhaite obtenir tous les messages indiquant que leur dernier commentaire est actif:

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

J'ai essayé cette solution:

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

et dans mon contrôleur:

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

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

mais dans cette solution si le dernier commentaire n'est pas actif Le commentaire précédent sera pris

p >


5 Réponses :


1
votes

-> latest () ne classe les articles que par created_at afin d'obtenir uniquement le dernier commentaire dont vous avez besoin -> latest () -> first ()


3 commentaires

Appel à la méthode non définie Illuminate \ Database \ Query \ Builder :: getRelated ()


la première méthode n'est pas autorisée dans la requête de relation


Vous obtenez une erreur getRelated car votre relation Comments est un HasMany, pas comme HasOne (même si vous n'en voulez qu'un). Vous pouvez donc mettre: $ this-> hasMany ('comments') -> latest () -> first ()



1
votes

Je pense que le code ci-dessous devrait fonctionner!

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

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


0 commentaires

2
votes

Je ne sais pas s'il existe une autre façon plus simple de faire cela, mais peut-être pouvez-vous l'essayer avec une sous-requête?

$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 commentaires

1
votes

Ce

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

ne devrait-il pas être

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


0 commentaires

0
votes

Selon votre question, le modèle Post a de nombreux commentaires. Et vous voulez obtenir le commentaire du message où active est un et doit être le dernier identifiant .

Obtenez le dernier commentaire comme suit

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

Obtenez tous les messages qui avaient le lastComment comme suit

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

Et filtrez les latestCommentPosts comme suit

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

Ou, vous pouvez également archiver par une requête comme suit.

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

Comme ça, vous avez tout le dernier commentaire avec active est 1.


0 commentaires