Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Laravel 5根据数据库结果形成另一个数组_Arrays_Database_Laravel_View - Fatal编程技术网

Arrays Laravel 5根据数据库结果形成另一个数组

Arrays Laravel 5根据数据库结果形成另一个数组,arrays,database,laravel,view,Arrays,Database,Laravel,View,我是拉威尔的新手,我已经为此挣扎了太久,尝试搜索SO和谷歌的信息,但无法解决这个问题 我正在创建博客,需要做一些导航/归档,显示年份和月份,以及每年和每月有多少篇博客文章。通过点击这些年/月,我将在不同的视图上显示这段时间内的帖子 我希望它们在视图中显示如下: 2015 (10) January(3) February(3) March(3) April(1) 2014 (2) May(1) June(1) $links = \DB::table('posts'

我是拉威尔的新手,我已经为此挣扎了太久,尝试搜索SO和谷歌的信息,但无法解决这个问题

我正在创建博客,需要做一些导航/归档,显示年份和月份,以及每年和每月有多少篇博客文章。通过点击这些年/月,我将在不同的视图上显示这段时间内的帖子

我希望它们在视图中显示如下:

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
等等

我得到了如下数据库查询:

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
这给了我这样的表格:

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
我怎样才能像我描述的那样在视图上打印它? 如果我在如下视图中遍历数组:

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($links作为$link)

@endforeach
我尝试在我的控制器中使用foreach循环从DB结果创建另一个数组,其中的结构形式正确,我可以使用foreach在视图上打印它,但无法使它工作


我知道我已接近解决方案,但我仍在学习。请有人告诉我哪种方法最好。

您可以在输出数据之前对数据做一些准备。例如:

$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
@foreach($results作为$year=>$result)
    @foreach(数据获取($result,'posts')作为$monthly\u post)
  • @endforeach
@endforeach

此代码未经测试,因此请将其用作您方法的灵感,而不是复制粘贴解决方案。

在您的刀片中尝试以下方法:

<?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

@foreach($links作为$link)
@if($first_loop==0)

@否则 @如果($current_year==$link->year)

@否则

@恩迪夫 @恩迪夫 @endforeach
感谢您的回答,但无法让它工作,它说:“不能将stdClass类型的对象用作数组”。我试图用$value->year和$value->id来修改它,但这给了我“对非对象的成员函数count()的调用”,我不知道为什么会这样说。您还可以解释为什么不建议在控制器中使用此选项吗?控制器应该只是将数据传递给模型/服务类,然后将其发送到视图。控制器应该有几行代码,以便阅读代码的人能够快速了解正在发生的事情。如果你不坚持这一点,它们可能会变得杂乱无章,无法阅读,更难测试和维护。好的,谢谢你,先生,所有这些对我来说都是全新的。所以最佳的解决方案是创建新的提供者,并将$links从controller传递到它的一些方法?如果我的问题让人困惑,我很抱歉……)没错,虽然provider不必是Laravel意义上的provider,但它可以只是一个普通类,您可以在其中进行预处理。关键是要保持你的控制器苗条,并在其他地方进行实际工作。这些问题没问题,我们都在学习这是我第一次尝试做的,但无法正常工作。这个解决方案在我看来有点难看,但仍然有效。谢谢