Сортировка красноречивой коллекции 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'))