在laravel中显示每周的每一天的帖子计数

时间:2017-04-13 11:11:25

标签: php laravel

我的控制器中有一个功能:

regression_results.conf_int(alpha=0.01)

我的观点是:

$one_week_ago = Carbon::now()->subDays(6)->format('Y-m-d');
$dates = Post::where('created_at', '>=', $one_week_ago)
        ->groupBy('date')
        ->orderBy('date', 'ASC')
        ->get(array(
             DB::raw('Date(created_at) as date'),
             DB::raw('COUNT(*) as "count"')
          ));

return view ('analytics', array('dates' => $dates));

我得到的输出为:

@foreach ($dates as $date => $count) 
      <p> {{ $date . '->' . $count }}</p>
@endforeach

问题: 没有帖子的日期(即postscount = 0)没有显示。 示例:2017-04-09,2017-04-10和2017-04-11未显示。

但我希望这些日期的输出为count:0

3 个答案:

答案 0 :(得分:2)

解决此问题的一种方法是首先构建一个包含默认值的集合(键是您正在查看的日期,值为0)。这为您提供了一个如下所示的数组:

[
    '2017-04-07' => 0,
    '2017-04-08' => 0,
    '2017-04-09' => 0,
    '2017-04-10' => 0,
    '2017-04-11' => 0,
    '2017-04-12' => 0,
    '2017-04-13' => 0,
]

然后我们会找到我们找到的帖子并致电pluck - 这可以让我们指定我们想要的值(count)和我们想要使用的密钥(date)。这不一定包含我们想要的所有日子,并且看起来像这样:

[
    '2017-04-07' => 12,
    '2017-04-10' => 3,
    '2017-04-11' => 7,
]

最后,我们使用第一个集合作为基础,根据键合并两个。这意味着我们可以保留我们设置的所有默认值(更重要的是,我们设置的所有7个日期),它只是用数据库中的结果覆盖单个日期值。

这是最终的代码:

// Build an array of the dates we want to show, oldest first
$dates = collect();
foreach( range( -6, 0 ) AS $i ) {
    $date = Carbon::now()->addDays( $i )->format( 'Y-m-d' );
    $dates->put( $date, 0);
}

// Get the post counts
$posts = Post::where( 'created_at', '>=', $dates->keys()->first() )
             ->groupBy( 'date' )
             ->orderBy( 'date' )
             ->get( [
                 DB::raw( 'DATE( created_at ) as date' ),
                 DB::raw( 'COUNT( * ) as "count"' )
             ] )
             ->pluck( 'count', 'date' );

// Merge the two collections; any results in `$posts` will overwrite the zero-value in `$dates`
$dates = $dates->merge( $posts );

return view( 'analytics', compact( 'dates' ) );

您的观点应该只是

@foreach ( $dates as $date => $count ) 
    <p> {{ $date }} = {{ $count }}</p>
@endforeach

答案 1 :(得分:1)

你的功能

for ($i=0, $i<=6; $i++) {
   $dates[] = Carbon::now()->subDays($i)->format('Y-m-d');
}

$data = Post::whereIn('created_at', $dates)
        ->groupBy('date')
        ->orderBy('date', 'ASC')
        ->get(array(
             DB::raw('Date(created_at) as date'),
             DB::raw('COUNT(*) as "count"')
          ))
->keyBy('date');

return view ('analytics', array('dates' => $dates, 'data' => $data));

并查看

@foreach ($dates as $date) 
      <p> {{ $date . '->' . isset($data[$date]) ? $data[$date] : 0; }}</p>
@endforeach

答案 2 :(得分:0)

  

@foreach($ date as $ date =&gt; $ count)         

{{$ date。 &#39; - &GT;&#39; 。 $ count}}

  @endforeach

&#34; $ date =&gt; $计数&#34;事物充当$ key =&gt;值并且不会以期望的格式返回结果。

由于您的数据是JSON对象,因此您可以将其显示为

@foreach ($data as $row) 
  <p> {{ $row['date'] . '->' . $row['count'] }}</p>
@endforeach

@foreach ($data as $row) 
  <p> {{ $row->date . '->' . $row->count }}</p>
@endforeach