Сортировка красноречивой коллекции by created_at
У меня есть таблица с именем "posts" с столбцами: "post_id int primary increments", "poster_id int" и "status text", а также массив с именами друзей с столбцами: "user_id int primary" и "friend_ids" текст.
Мне нужно собрать все идентификаторы в текстовом столбце друзей, что достаточно просто:
$friends = explode(',', \Friend::where('user_id', \Sentry::getUser()->id)->first()->friend_ids);
Если данные в текстовом столбце будут выглядеть как "1,2,3" и т.д.
Затем я создаю объект Eloquent Collection, который также легко выполняется с помощью:
$posts = new \Illuminate\Database\Eloquent\Collection();
Но проблема в том, что я не могу понять, как заполнить коллекцию и отсортировать ее содержимое столбцом "created_at".
Это то, что у меня есть на данный момент:
foreach($friends as $id) {
$posts_ = \Post::where('poster_id', $id)->getQuery()->orderBy('created_at', 'desc')->get();
foreach($posts_ as $post) {
$posts->add($post);
}
}
Я не могу понять, будет ли этот код работать или нет, чтобы сортировать весь сбор сообщений по столбцу "created_at". Мне также нужно будет легко разбивать всю коллекцию.
Каков рекомендуемый способ сортировки коллекции?
Ответы
Ответ 1
Если вы хотите отсортировать collection
, вы можете использовать метод sortBy
с помощью заданного ключа
$sorted = $posts->sortBy('created_at');
Также вы можете применить функцию обратного вызова на collection
$sorted = $posts->sortBy(function($post)
{
return $post->created_at;
});
Надеюсь, это поможет. Для получения дополнительной информации о collections
вы можете прочитать docs
Ответ 2
Вам не нужно перебирать массив $friends
, вы можете просто использовать его вместе с whereIn, как этот
$posts = \Post::whereIn('poster_id', $friends)->latest()->get();
Это заменяет создание пустой коллекции и foreach
-loop, и дает вам все ваши сообщения друзей в одной коллекции, отсортированной по created_at
(функция latest
является ярлыком для orderBy('created_at', 'desc')
)