代码之家  ›  专栏  ›  技术社区  ›  ST80

php laravel如何将日期数据分组为月份并添加标题

  •  1
  • ST80  · 技术社区  · 7 年前

    我在建一个小的 Laravel -我要显示按月份分组的特定版本的应用程序。像这样:

    January
    11.1 - blabla
           more blablabla the same day
    
    15.1 - blablabla
    
    February
    05.2 - blabla
    
    etc...
    

    所以,在我的控制器中,我只是这样做:

    public function index() {
    
      $releases = Release::orderBy('release_date', 'asc')->get();
    
      return view('pages.index')->with('releases', $releases);
    }
    

    在我的Blade View文件中,我浏览了以下数据:

    @foreach ($releases as $release)
         <div>
            <p>
                <span>{{ \Carbon\Carbon::parse($release->release_date)->format('d. M')}}</span>&nbsp;
                <span>{{$release->artist}} - {{$release->album_title}} </span>
            </p>
        </div>
    @endforeach
    

    这为我提供了正确的数据,例如数据库条目列表,但如前所述,我希望按月对它们进行分组,并为每个月添加一个标题。我怎样才能做到?

    我在用 Laravel 5.5 如果这很重要…

    8 回复  |  直到 7 年前
        1
  •  1
  •   rubys    7 年前
    public function index() {
    
        $releases = Release::orderBy('release_date', 'asc')
                ->get()->groupBy('release_date.month');
    
        return view('pages.index')->with('releases_groups', $releases);
    }
    
    @foreach ($releases_groups as $month => $releases_group)
        // just place group info here...
        @foreach ($releases_group as $release)
        <div>
            <p>
              <span>{{ \Carbon\Carbon::parse($release->release_date)->format('d. M')}}</span>&nbsp;
              <span>{{$release->artist}} - {{$release->album_title}} </span>
            </p>
        </div>
      @endforeach
    @endforeach
    

    试试这个。

        2
  •  2
  •   Saleemi    7 年前

    你可以这样做:

    表:发行版

    id    |    released_at    |    bla_details    |    month_header_id
    

    表:月标题

    id    |    month(specific length int)    |    year(specific length int)    |    header
    

    型号:release.php

    public function month_header() 
    {
        return $this->belongsTo('App\Models\Month');
    }
    

    型号:monthheader.php

    public function releases() 
    {
        return $this->hasMany('App\Models\Release');
    }
    

    帮助者:GetMonthName($integer)

    控制器:tempcontroller.php

    public function temp()
    {
        $response['month_headers'] = MonthHeader::all();
        return view('tempView', $response);
    }
    

    叶片视图:tempview.blade.php

    @foreach($month_headers as $header)
        {{getMonthName($header->month)." (".$header->header.")"}}
        <ul>
            @foreach($month_headers->releases() as $release)
                <li>{{date('d.m', strtotime($release->released_at))." - ".$release->bla_details}}</li>
            @endforeach
        </ul>
    @endforeach
    

    视图输出

    一月(一月标题)

    • 11.1 -布莱布
    • 15.1-布拉布拉布拉

    二月(二月标题)

    • 5.2 -布莱布
    • 6.2 -布莱布

    等。。。

        3
  •  1
  •   Petay87    7 年前

    我建议让你的控制器做更多的工作:

    public function index() {
    
      // Here we get a distinct list of dates in your format
      $releaseDates = Release::Selectraw('date_format(date(release_date),"%d.%m") as Date')->distinct()->get();
    
      // For each date we now get the elements for each date and put them as an array entry in to the date under a 'data' section
      foreach($releaseDates as $releaseDate){
         $releaseDate['data'] = Release::whereraw('date_format(date(release_date),"%d.%m") = '.$releaseDate->Date)->get();
      }
    
      // Pass the data to the view as before but with new name
      return view('pages.index')->with('releaseDates', $releaseDates );
    }
    

    那么在你看来:

    // For each release date first
    @foreach ($releaseDates as $releaseDate)
         <div>
            <p>
                //Print out the date as requested
                <span>{{ \Carbon\Carbon::parse($releaseDate->Date)->format('d. M')}}</span>&nbsp;
                // Now loop through each record nested as an array inside the date
                @foreach($releaseDate['data'] as $data)
                     <span>{{$data->artist}} - {{$data->album_title}} </span>
                     <br>
                @endforeach
            </p>
        </div>
    @endforeach
    
        4
  •  0
  •   zlodes    7 年前

    您可以使用如下的collection::groupby()方法:

    $releases->groupBy(function(Release $release) {
         return $release->release_date->format('F');
    });
    

    现在 发行美元 是以月份名称为键,集合(发布数组)为值的集合,如下所示:

    [
        "January" => Collection{Release, Release, Release},
        "February" => Collection{Release, Release, Release},
        ...
    ]
    

    别忘了岁月;)

        5
  •  0
  •   gayatri darade    7 年前

    UnionAll是将标题和日期数据分组为几个月的最佳方法。

        6
  •  0
  •   FGDeveloper    7 年前

    如果使用->get()->groupby(“release_date”)方法,则按日期返回对象。

    例如;

    public function index() {
    
      $releases = Release::orderBy('release_date', 'asc')->get()->groupBy('release_date');
    
      return view('pages.index')->with('releases', $releases);
    }
    

    我想解决你的问题。

        7
  •  0
  •   gregory    7 年前

    像这样的东西(在你的控制器里)怎么样?

    $groupedReleases = null;
    
    foreach ($releases as $release) {
        $date = $release->release_date->format('your desired format');
        $groupedReleases[$date][] = $release;
    }
    
    return $groupedReleases;
    
        8
  •  0
  •   Shan    7 年前

    请参阅下面的带有原始查询的select函数,其中我添加了“月份名称”和“月份号”供您参考。请检查输出。希望这对您有所帮助。

    $releases = Release::select(DB::raw('some_field, MONTHNAME(release_date) as month_name, MONTHNAME(release_date) as month'))
                              ->orderBy('release_date', 'asc')->get();
    

    如果您确定同一日期没有多个版本,则可以使用groupby。

        $releaseArray=[];
        if(!empty($releases)) {
            foreach($releases as $release){
                $releaseArray[$release->month][] = $release;
            }
        }
    
        print_r($releaseArray);
    

    现在,您可以将$releaseArray传递给视图,并对按月分组的版本进行迭代。

    推荐文章