Bonjour,

je souhaite récupèrer le nom de la personne qui a posté le dernier commentaire dans un sujet pour un forum.
Voila ce que je fais au niveau de PhpMyAdmin et qui marche vue que je récupère les bonnes valeurs :

select commentaires.auteur
from commentaires inner join sujets on commentaires.sujet_id = sujets.id
where commentaires.id = (
select max(commentaires.id)
from commentaires inner join sujets on commentaires.sujet_id = sujets.id
where sujets.id = 12
);

Je pensais utiliser QueryBuilder pour récupèrer les valeurs que je voulais mais je me rends compte que c'est
assez complexe..
Voici un de mes essai :

DB::table('commentaires')->join('sujets', 'sujets.id','=','commentaires.sujet_id')  
 ->where(['commentaires.id' => DB::raw('max(commentaires.id')])
->where('sujets.id','=', $unSujet->id)
->value('commentaires.auteur')

Ou bien auriez-vous une idée plus simple ?
Merci par avance pour votre aide.

2 réponses


AlexJM
Réponse acceptée

Bonjour,

Bon j'avais écrit un pavé, avant de voir que ton problème c'est juste de récupérer le dernier commentaire, pas de récupérer le dernier commentaire en même temps que le sujet. Je le laisse au cas ou en dessous.

Tu te compliques grandement la vie, une simple requête du type :

SELECT * FROM commentaires WHERE commentaires.sujet_id = 12 ORDER BY id DESC LIMIT 1

Du coup dans ton modèle commentaire, tu peux faire un scope :

public function scopeDernierCommentaire($query, $sujet){
    return $query->where('sujet_id', $sujet)->orderBy('id', 'DESC')->limit(1);
}

Et tu peux l'appeler directement :

Commentaire::dernier_commentaire(12)->get();

Ou si tu retires le limit(1)

Commentaire::dernier_commentaire(12)->first();

(Ici c'était le pavé)
Alors tu as plusieurs choix :
1) tu peux faire comme tu as fait, cad avec le query builder :
Attention, à ce moment il faut que tu saches que si certains sujets n'ont pas de dernier commentaire, la requête ne fonctionnera pas.
Si tu veux qu'elle renvoie NULL comme dernier commentaire s'il n'existe pas, tu dois faire un leftJoin.
Et aussi, je te conseille de faire un scope pour récupérer le dernier commentaire dans ta requête plus facilement sans devoir refaire à chaque fois la requête.

Avantages :

  • Tu ne fais qu'une requête.
    Inconvénients :
  • Tu fais une requête plus compliquée (beaucoup).

2) tu peux aussi faire une relation de type hasOne (dans sujet) :

public function dernier_commentaire(){
    return $this->hasOne(App\Commentaire::class)->orderBy('id', 'DESC');
}

et récupérer via $sujet->dernier_commentaire

Avantages :

  • Beaucoup plus simple.
    Inconvénients :
  • Deux requêtes.

Bonjour,

effectivement je me suis compliqué la vie..
Je ferais tout depuis le modèle ce sera plus simple je pense que faire
des requêtes aussi compliqué avec Query Builder dans mon contrôleur.
En tous cas merci beaucoup pour ton aide ca marche
et c'est super pratique depuis le modèle.