У меня есть таблица с именем «posts» с столбцами: «post_id int primary increments», «poster_id int» и «status text», а также массив с именами друзей с столбцами: «user_id int primary» и «friend_ids text».
Мне нужно собрать все идентификаторы в текстовом столбце друзей, который достаточно прост, используя:
$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» объекта Post.
Это то, что у меня есть на данный момент:
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». Мне также нужно будет легко разбивать всю коллекцию.
Каков рекомендуемый способ сортировки коллекции?
Если вы хотите отсортировать collection
вы можете использовать метод sortBy
помощью заданного ключа
$sorted = $posts->sortBy('created_at');
Также вы можете применить функцию обратного вызова в collection
$sorted = $posts->sortBy(function($post) { return $post->created_at; });
Надеюсь это поможет. Для получения дополнительной информации о collections
вы можете прочитать документы
Вам не нужно перебирать массив $friends
, вы можете просто использовать его вместе с whereIn как это
$posts = \Post::whereIn('poster_id', $friends)->latest()->get();
Это заменяет создание пустой коллекции и foreach
-loop и дает вам все ваши сообщения друзей в одной коллекции, отсортированной по created_at
( latest
функция является ярлыком для orderBy('created_at', 'desc')
)