2017-06-19 17 views
0

投稿とその投稿への返信を表示するビューを作成しました。この質問の時点では、応答はforeachループで、ランダムな順序で表示されます。最も早い返信がトップになるようにforeachループを順序付ける方法はありますか?最下位の返信は?事前にLaravel 5.2日付別のForeach注文

このループ

@foreach($topic->replies as $reply) 
     <div class="collection"> 
      <div class="collection-item row"> 
       <div class="col s3"> 
        <div href="" class="avatar collection-link"> 
        <div class="row"> 
         <div class="col s3"><img src="/uploads/avatars/{{ $reply->user->avatar }}" alt="" class="circle" style="width: 50px;"></div> 
          <div class="col s9"> 
           <p class="user-name">{{ $reply->user->username }}</p> 
          </div> 
         </div> 
           <p>Role: {{ $reply->user->role->role_name }}</p> 
           <p>Since: {{ $reply->user->created_at }}</p> 
           <p class="post-timestamp">Posted on: {{ $reply->created_at }}</p> 
        </div> 
        </div> 
        <div class="col s9"> 
         <div class="row last-row"> 
         <div class="col s12"> 
          <p>{!! $reply->reply_text !!}</p> 
         </div> 
         </div> 
         <div class="row last-row block-timestamp"> 
         <div class="col s6"> 
          <p class="post-timestamp">Last changed: {{ $reply->updated_at }}</p> 
         </div> 
         </div> 
       </div> 
      </div> 
     </div> 
@endforeach 

TopicsController.php(表示方法)

public function show($theme_id, $topic_id) 
{ 
    $theme = Theme::with('topics')->findOrFail($theme_id); 
    $topic = Topic::with('theme')->findOrFail($topic_id); 

    return view('topics.topic')->withTopic($topic)->withTheme($theme); 

} 

ありがとう!

+1

いいえ、ループの前にループするデータ配列を注文する必要がある場合は、「foreachループを注文する」ことはできません。しかし、これはむしろデータベースレベルで起こるはずです。あなたが望むようにソートされた結果を返すようにクエリを記述します。 – CBroe

+0

あなたのトピッククエリの中で 'latest()'メソッドを使って回答を整理します。 –

+0

いいえ、「foreachループを注文する」ことはできません。代わりにデータを取得するときには「orderBy」を使用してください。 –

答えて

1

すべてのEloquentクエリはLaravel collectionsを返します。したがって、sortBy関数を使用して、foreach内の応答を並べ替えることができます。

@foreach($topic->replies->sortByDesc('created_at') as $reply) 

ただし、より良い解決策は、クエリで返信を注文することです。これは、このようなあなたの雄弁クエリを更新することによって達成することができます。私にとって

$topic = Topic::with([ 
    'theme', 
    'replies' => function ($query) { 
     $query->orderByDesc('created_at'); 
    } 
]) 
->findOrFail($topic_id); 
+0

ありがとうございます!間違いなく私が探していたもの –

+0

Gload私は助けることができました。これがあなたの質問を解決した場合、これを解決策としてマークして、他の人がこれを見つけるかもしれないと考えてください。 :) – Jerodev

+0

@ Feudelcosine148上記のコードでこの ' - > withTheme($ theme)'をどうやって解決しましたか? –

0

きれいなオプションは、あなたのTopicモデルでは、同じようcreated_atタイムスタンプを使用して、デフォルトでは関係の結果を注文されましたこれは

class Topic 
{ 
    public function replies() 
    { 
     return $this->hasMany('Reply')->orderBy('created_at','desc'); 
    } 
} 

このようにすると、後でコレクションを注文する必要はなく、SQLにはrkを使用すると、ほぼ毎回トピックがそのように注文される必要があるため、コードが軽くなり、パフォーマンスが向上します。

これも共有コードはそのまま残すことができるという利点がありますが、私は(実行されてから、不要なクエリを避けるために)熱心な負荷にあなたのコントローラ内の関係を、あなたをお勧めします:

$topic = Topic::with(['theme','replies'])->findOrFail($topic_id); 

・ホープ、このあなたを助けます。

関連する問題