wadigchan
@wadigchan

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

二つの配列を同時に表示させたい

解決したいこと

laravelを使ったブログサイトを作成しています。
とても初歩的な質問になってしまうのですが

月別ブログ一覧機能を作りたく、

スクリーンショット 2022-03-31 16.05.16.png

このように、月の横にその月のブログ数も一緒に表示させたいのですが、その方法がわかりません。
二つの配列を同時に表示させるのか、片方の配列にまとめて入れて取り出すのか。

現在はこのように書いています。

PostController.php
for ($i = 1; $i <= 12; $i++) {
  $counts[] =  Post::where('is_published', 1)
   ->whereYear('created_at',  2022)
   ->whereMonth('created_at', $i)
   ->count();
}
index.blade.php
<div class="month">
 <h1 class="month-title">月別記事</h1>
 <div class="card-month">
 @foreach($counts as $count)
  <li class="li-month">
  {{$count}}
  </li>
 @endforeach
 </div>
</div>

まだ blade は投稿数しか書けておらず、
2022/{{ $i }}
のようなものを追加して表示させたいです。

回答よろしくお願いします。

0

1Answer

2つの配列「月」と「ブログ数」が必ず同じキーで取得できるなら並列にやっても問題ないと思います。
ただ、12回×年数分SQLを発行することになるので、まとめてみます。

日付型のカラムに対して年月ごとに集計したい場合は、以下のようなSQLが可能です。

これはMySQL
SELECT
    DATE_FORMAT(created_at, '%Y') as year,
    DATE_FORMAT(created_at, '%m') as month,
    COUNT(*) as count
FROM
    posts
GROUP BY
    DATE_FORMAT(created_at, '%Y%m')
ORDER BY
    DATE_FORMAT(created_at, '%Y%m');

LaravelのORMはわからないので書き方は間違っているかもしれませんが

$posts = Post::selectRaw("DATE_FORMAT(created_at, '%Y') as year, DATE_FORMAT(created_at, '%m') as month, COUNT(*) as count")
             ->groupByRaw("DATE_FORMAT(created_at, '%Y%m')")
             ->orderByRaw("DATE_FORMAT(created_at, '%Y%m')");

foreach ($posts as $post) {
   echo "<li>{$post->year}{$post->month}月 ({$post->count}件)</li>";
}
0Like

Comments

  1. @wadigchan

    Questioner

    回答ありがとうございます!
    自分でこのようにやってみたら実装できたのですが、これも正解ですかね?

    Post::whereYear('created_at', 2022)
    ->orderBy('created_at')
    ->get()
    ->groupBy(function ($row) {
    return $row->created_at->format('m');
    })
    ->map(function ($day) {
    return $day->count();
    });


    @foreach($monthPosts as $month => $count)
    <li class="li-month">
    <a href="{{ route('posts.month', [2022, $month]) }}" class="a-month">
    2022/{{ $month }} ({{$count}})
    </a>
    </li>
    @endforeach

Your answer might help someone💌