2015-10-13 60 views
1

我是Laravel的新手,現在我一直在努力掙扎太久,試圖搜索SO和谷歌的信息,但無法解決這個問題。Laravel 5從數據庫結果形成另一個陣列

我在創建博客,需要製作某種導航/存檔,顯示年份和月份以及每年和每個月有多少博客文章。通過點擊這些年份/月份,我會在該時間段內以不同的視圖顯示帖子。

我希望他們能夠顯示在這樣的觀點:

2015 (10) 
    January(3) 
    February(3) 
    March(3) 
    April(1) 
2014 (2) 
    May(1) 
    June(1) 

等。

我得到了數據庫查詢這樣的:

$links = \DB::table('posts') 
    ->select(\DB::raw('YEAR(created_at) year, MONTH(created_at) month, MONTHNAME(created_at) month_name, COUNT(*) id')) 
    ->where('active',1) 
    ->groupBy('year') 
    ->groupBy('month') 
    ->orderBy('year', 'desc') 
    ->orderBy('month', 'desc') 
    ->get(); 

這使我的表是這樣的:

array:3 [ 
     0 => {#275 
     +"year": "2015" 
     +"month": "10" 
     +"month_name": "October" 
     +"id": "3" 
     } 
     1 => {#274 
     +"year": "2015" 
     +"month": "9" 
     +"month_name": "September" 
     +"id": "1" 
     } 
     2 => {#273 
     +"year": "2014" 
     +"month": "8" 
     +"month_name": "August" 
     +"id": "1" 
     } 
    ] 

我怎樣才能將它打印在我看來像我描述? 如果我去遍歷數組中的觀點是這樣的:

@foreach($links as $link) 
    <h3 class="text-uppercase"><a href="{{ url('blog/'.$link->year) }}">{{ $link->year }}</a></h3> 
    <p><small class="blog_date"><a href="{{ url('blog/'.$link->year.'/'.$link->month) }}">{{ $link->month_name }} ({{ $link->id }}) </a></small> 
@endforeach 

我試圖用的foreach循環在我的控制器來從DB-結果另一個數組,其中結構將是正確的形式,我可以只使用的foreach在視圖上打印它,但不能得到它的工作。

我知道我接近解決方案,但我還在學習。請有人告訴我哪個是最好的方法來做到這一點。

回答

1

在刀片試試這個:

<?php $first_loop = 0; ?> 
@foreach($links as $link) 
    @if($first_loop == 0) 
     <?php 
     $first_loop = 1; 
     $current_year = $link->year; 
     ?> 
     <h3 class="text-uppercase"><a href="{{ url('blog/'.$link->year) }}">{{ $link->year }}</a></h3> 
     <p><small class="blog_date"><a href="{{ url('blog/'.$link->year.'/'.$link->month) }}">{{ $link->month_name }} ({{ $link->id }}) </a></small></p> 
    @else 
     @if($current_year == $link->year) 
      <p><small class="blog_date"><a href="{{ url('blog/'.$link->year.'/'.$link->month) }}">{{ $link->month_name }} ({{ $link->id }}) </a></small></p> 
      <?php 
      $current_year = $link->year; 
      ?> 
     @else 
      <h3 class="text-uppercase"><a href="{{ url('blog/'.$link->year) }}">{{ $link->year }}</a></h3> 
      <p><small class="blog_date"><a href="{{ url('blog/'.$link->year.'/'.$link->month) }}">{{ $link->month_name }} ({{ $link->id }}) </a></small></p> 
      <?php 
      $current_year = $link->year; 
      ?> 
     @endif 
    @endif 
@endforeach 
+0

這是我實際嘗試先做的事,但無法正常工作。解決方案看起來有點難看,但它仍然有效。謝謝! – mpak

1

在輸出數據之前,您可以對數據做一些準備。例如:

$links = // .. your query; 

$years = array_pluck($links, 'year'); 

$results = []; 


foreach($years as $year) 
{ 
    $posts_count = 0; 
    $posts = array_where($links, function($key, $value) use ($year, $posts_count){ 
     if($value['year'] == $year) 
     { 
      $posts_count += $value['id']; 
      return true; 
     } 

     return false; 
    }); 

    $results[$year] = ['posts' => $posts, 'posts_count' => $posts_count]; 
} 

你可以做上面的一些資料庫/服務類,甚至如果你想在控制器(但不推薦)

然後在你看來,你可以有這樣的:

@foreach($results as $year => $result) 
    <a href="">{{ $year }} {{ data_get($result, 'posts_count') }}</a> 
     <ul> 
      @foreach(data_get($result, 'posts') as $monthly_post) 
       <li><a href="">{{ data_get($monthly_post, 'month_name') }} {{ data_get($monthly_post, 'id') }}</a></li> 
      @endforeach 
     </ul> 
@endforeach 

此代碼是未經測試的,所以用它作爲靈感爲你的方法,而不是複製粘貼的解決方案。

+0

感謝您的回答,無法得到它的工作,雖然,它說:「不能用型stdClass的對象作爲排序」。我試圖修改它使用$ value-> year和$ value-> id但是這給了我「調用一個非對象的成員函數count()」,我不知道它爲什麼這麼說。 也可以解釋爲什麼不推薦在控制器中使用它? – mpak

+0

控制器應該只是將數據傳遞給模型/服務類,然後將其發送到視圖。控制器應該有幾行代碼,以便有人閱讀代碼可以快速瞭解正在發生的事情。如果你不堅持這一點,他們會變得混亂,難以閱讀和難以測試和維護。 –

+0

好的,謝謝你,先生,這對我來說是非常新的。那麼最佳的解決方案是創建新的提供者並將$ link從控制器傳遞給它的一些方法?如果我的問題很混亂,我很抱歉。:) – mpak