Tengo una función en mi controlador con esto:
$one_week_ago = Carbon::now()->subDays(6)->format('Ym-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));Y mi opinión es:
@foreach ($dates as $date => $count) <p> {{ $date . '->' . $count }}</p> @endforeachEstoy obteniendo la salida como:
0 -> {"date":"2017-04-07","count":7} 1 -> {"date":"2017-04-08","count":2} 2 -> {"date":"2017-04-12","count":4} 3 -> {"date":"2017-04-13","count":1}Problema: Las fechas en las que no hay publicaciones (es decir, postscount = 0) no se muestran. Ejemplo: 2017-04-09, 2017-04-10 y 2017-04-11 no se muestran.
Pero quiero la salida para esas fechas como cuenta: 0
Un enfoque para abordar esto es crear una colección que contenga primero los valores predeterminados (las claves son las fechas que está viendo y los valores son 0). Esto le da una matriz que se ve así:
[ '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, ] Luego tomamos las publicaciones que encontramos y llamamos a pluck ; esto nos permite especificar el valor que queremos ( count ) y la clave que nos gustaría usar ( date ). Esto no necesariamente tendrá todos los días que queremos, y se verá así:
[ '2017-04-07' => 12, '2017-04-10' => 3, '2017-04-11' => 7, ]Finalmente, fusionamos los dos en función de las claves, utilizando la primera colección como base. Esto significa que podemos mantener todos los valores predeterminados que configuramos (y lo que es más importante, las 7 fechas que configuramos) y simplemente sobrescribe los valores de días individuales con los resultados de la base de datos.
Aquí está el código final:
// 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( 'Ymd' ); $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' ) );Su vista entonces debería ser simplemente
@foreach ( $dates as $date => $count ) <p> {{ $date }} = {{ $count }}</p> @endforeachtu funcion
for ($i=0; $i<=6; $i++) { $dates[] = Carbon::now()->subDays($i)->format('Ym-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));y ver
@foreach ($dates as $date) <p> {{ $date . '->' . isset($data[$date]) ? $data[$date] : 0; }}</p> @endforeach@foreach ($fechas como $fecha => $recuento)
{{ $fecha . '->' . $contar }}
@endforeach
La cosa "$fecha => $recuento" actúa como $clave => valor y no le devolverá el resultado en el formato deseado.
Dado que sus datos son un objeto JSON, puede mostrarlos como
@foreach ($data as $row) <p> {{ $row['date'] . '->' . $row['count'] }}</p> @endforeacho
@foreach ($data as $row) <p> {{ $row->date . '->' . $row->count }}</p> @endforeach