Bonjour,

Je cherche une solution à mon problème :

Ce que je fais

Je suis en train de créer un forum (sujet, messages, etc) et je souhaiterais trier mes topics par date du dernier message posté sur le topic.

Par exemple :

Sur mon topic 1, le dernier message date de 15:30
Sur mon topic 2, le dernier message date de 15:32

Du coup, dans la liste que je souhaite afficher, j'aurai le topic 2, puis ensuite le topic 1

Mes topics sont reliés à leur forum par la relation suivante

public function topics(){
        return $this->hasMany('App\Topic', 'forum_id');
    }

Ici le code qui me retourne la collection que j'utilise pour l'affichage sur ma vue.

return $forum->topics()
                    ->where('pinned', false)
                    ->join('comments', 'comments.topic_id', '=', 'topics.id')
                    ->orderBy('comments.created_at', 'desc')
                    ->select('topics.id', 'topics.name', 'topics.slug','topics.message','topics.online','topics.pinned','topics.locked', 'topics.answerable','topics.forum_id','topics.user_id', 'comments.created_at')
                    ->distinct('topics.id')
                    ->paginate(20);

Ce que j'obtiens

Grace au disctinct, j'arrive à obtenir une liste sans trop de doublons (ça ne fonctionne pas entièrement), mais le problème c'est que le join me crée plein de doublons (et fait bugger mon paginate).

Y a t il un moyen propre de trier des enregistrements d'une table en fonction de la valeur d'un champ d'un enregistrement d'une autre table, relié par une dépendance? (le tout sans doublons ?)

Merci d'avance !

2 réponses


Amilti
Réponse acceptée

Hello,
Au lieu de te prendre la tête à faire une requête pourquoi tu rajouterais pas un champ dans ta table topics genre last_date_answer qui serait une date que tu viendrais mêttre à jour quand un commentaire est ajouté/mis à jour/supprimé à l'aide d'un Observer sur ton model comment au saved ?
https://laravel.com/docs/5.6/eloquent#observers

Heribert
Auteur

Merci beaucoup, en effet, c'est moins casse tête, et tu m'apprends une fonctionnalité de Laravel que je ne connaissais pas :)