2017-06-19 107 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

所有雄辯查詢返回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

感謝它的工作! Excatly我在找什麼 –

+0

Gload我可以幫忙。如果這解決了您的問題,請考慮將此標記爲解決方案,以便其他人可能會發現此問題。 :) – Jerodev

+0

@ Feudelcosine148你是如何解決這個' - > withTheme($主題)'與上面的代碼? –

0

對我來說,最乾淨的方法是,在你的Topic模型,運用created_at時間戳,如訂單默認的關係結果這個:

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

這樣你就不需要訂購集合後,讓sql做窩因爲您幾乎每次都需要以這種方式訂購的主題,因此代碼更輕,性能更好。

這也有你的代碼共享可以保持不變的優勢,但我會建議你渴望負載控制器的關係(以避免執行不必要的查詢):

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

希望這幫助你。