web-dev-qa-db-ja.com

Eloquentコレクションをcreated_atでソートする

「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」列で並べ替えるかどうかはわかりません。また、コレクション全体を簡単にページ分割できる必要もあります。

コレクションを並べ替える推奨される方法は何ですか?

21
Liam Potter

collectionをソートする場合は、特定のキーでsortByメソッドを使用できます

$sorted = $posts->sortBy('created_at');

また、collectionにコールバック関数を適用できます

$sorted = $posts->sortBy(function($post)
{
  return $post->created_at;
});

お役に立てれば。 collectionsの詳細については、 docs をご覧ください。

46
Altrim

_$friends_配列をループする必要はありません。このように whereIn と組み合わせて使用​​できます

_$posts = \Post::whereIn('poster_id', $friends)->latest()->get();
_

これにより、空のコレクション作成とforeach- loopが置き換えられ、すべての友達の投稿が_created_at_でソートされた1つのコレクションになります。

latest関数はorderBy('created_at', 'desc')のショートカットです)

3
Arvid