PHP Laravel, как сгруппировать данные даты по месяцам и добавить заголовок - PullRequest
0 голосов
/ 09 января 2019

Я создаю небольшое приложение 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);
}

И в моем файле вида лезвия я перелистываю данные:

@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 ]

0 голосов
/ 09 января 2019

См. Ниже функцию выбора с необработанным запросом, где я добавил «Имя месяца» и «номер месяца» для справки. Пожалуйста, проверьте вывод. Надеюсь, это поможет вам

$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 в представление и выполнить итерации для выпусков, сгруппированных по месяцам.

0 голосов
/ 09 января 2019

Как насчет этого (в вашем контроллере)?

$groupedReleases = null;

foreach ($releases as $release) {
    $date = $release->release_date->format('your desired format');
    $groupedReleases[$date][] = $release;
}

return $groupedReleases;
0 голосов
/ 09 января 2019

Вы можете сделать это так:

Таблица: выпуски

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);
}

Blade View: 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

Просмотр вывода

Январь (Jan Header)

  • 11,1 - блабла
  • 15.1 - блаблабла

Февраль (заголовок февраля)

  • 05.2 - блабла
  • 06,2 - блабла

и т.д ...

0 голосов
/ 09 января 2019

Я предлагаю заставить ваш контроллер выполнять больше работы:

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
0 голосов
/ 09 января 2019
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

Попробуйте это.

0 голосов
/ 09 января 2019

Если вы используете метод -> get () -> groupBy ('release_date'), он возвращает объекты по дате.

Например;

public function index() {

  $releases = Release::orderBy('release_date', 'asc')->get()->groupBy('release_date');

  return view('pages.index')->with('releases', $releases);
}

Я думаю, что решение вашей проблемы.

0 голосов
/ 09 января 2019

Вы можете использовать метод Collection :: groupBy () следующим образом:

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

Теперь $ Releases - это Collection с именем месяца в качестве ключа и Collection (массивом Releases) в качестве значения, подобного этому:

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

Не забывай годы;)

0 голосов
/ 09 января 2019

UNION ALL - лучший способ сгруппировать данные заголовка и даты группы по месяцам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...