Trier la collection Eloquent par created_at
J'ai une table nommée 'posts' avec les colonnes: 'post_id int increments primaires', 'poster_id int' et 'text text' ainsi qu'un tableau nommé friends avec les colonnes: 'user_id int primary' et 'friend_ids text'.
J'ai besoin de récupérer tous les identifiants dans la colonne de texte des amis, ce qui est assez facile en utilisant:
$friends = explode(',', \Friend::where('user_id', \Sentry::getUser()->id)->first()->friend_ids);
Où les données dans la colonne de texte ressembleraient à "1,2,3", etc.
Ensuite, je crée un objet Eloquent Collection qui se fait aussi facilement via:
$posts = new \Illuminate\Database\Eloquent\Collection();
Mais le problème est que je ne peux pas comprendre comment remplir la collection et trier son contenu par la colonne 'created_at' de l'objet Post.
Voici ce que j'ai en ce moment:
foreach ($friends as $id) {
$posts_ = \Post::where('poster_id', $id)->getQuery()
->orderBy('created_at', 'desc')
->get();
foreach($posts_ as $post) {
$posts->add($post);
}
}
Je ne peux pas savoir si ce code fonctionnerait ou non pour trier la collection entière de messages par la colonne 'created_at'. J'aurais également besoin de pouvoir paginer toute la collection facilement.
Quelle est la méthode recommandée pour trier la collection?
Si vous voulez trier un collection
vous pouvez utiliser la méthode sortBy
par clé donnée
$sorted = $posts->sortBy('created_at');
Vous pouvez également appliquer une fonction de rappel sur le collection
$sorted = $posts->sortBy(function($post)
{
return $post->created_at;
});
J'espère que cela t'aides. Pour plus d'informations sur collections
, vous pouvez lire le docs
Vous n'avez pas besoin de parcourir le tableau $friends
, Vous pouvez simplement l'utiliser avec whereIn comme ceci
$posts = \Post::whereIn('poster_id', $friends)->latest()->get();
Cela remplace la création de collection vide et la boucle foreach
-, et vous donne tous les messages de vos amis dans une collection triée par created_at
(la fonction latest
est un raccourci pour orderBy('created_at', 'desc')
)