2017-06-19 108 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); 

希望这帮助你。