「post_id int primary increments」、「poster_id int」および「status text」という列を持つ「posts」という名前のテーブルと、「user_id int primary」および「friend_ids text」という列を持つfriendsという名前の配列があります。
Friendsテキスト列のすべてのIDを取得する必要があります。
$friends = explode(',', \Friend::where('user_id', \Sentry::getUser()->id)->first()->friend_ids);
テキスト列のデータが「1,2,3」などのように見える場所.
次に、Eloquent Collectionオブジェクトを作成します。これも簡単に実行できます。
$posts = new \Illuminate\Database\Eloquent\Collection();
しかし、問題は、コレクションにデータを追加し、Postオブジェクトの「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」列で並べ替えるかどうかはわかりません。また、コレクション全体を簡単にページ分割できる必要もあります。
コレクションを並べ替える推奨される方法は何ですか?
collection
をソートする場合は、特定のキーでsortBy
メソッドを使用できます
$sorted = $posts->sortBy('created_at');
また、collection
にコールバック関数を適用できます
$sorted = $posts->sortBy(function($post)
{
return $post->created_at;
});
お役に立てれば。 collections
の詳細については、 docs をご覧ください。
_$friends
_配列をループする必要はありません。このように whereIn と組み合わせて使用できます
_$posts = \Post::whereIn('poster_id', $friends)->latest()->get();
_
これにより、空のコレクション作成とforeach
- loopが置き換えられ、すべての友達の投稿が_created_at
_でソートされた1つのコレクションになります。
(latest
関数はorderBy('created_at', 'desc')
のショートカットです)