LaravelでテーブルをgroupByしてPaginateできない...上手く組む方法

### グループ化したレコードを指定件数で出したい用例

例えば、１つのテーブルに日付とその日付に対して複数の時間が組まれている場合。
・ 学校の日別の講義情報
・ セミナーの日程リスト
・ 日報のレポートリスト
など。

日付ごとにグループ化し、その日付の配下にその日付に該当するレコードを１対多にしたい。
こういったケースなどで、グループ化とページネーションを組みたいと考えたりします。


#### timetable テーブル
テーブルはこんな感じだとします。
| 名前         | タイプ     | 説明 |
|:------------|:----------|:------------|
| id          | int(10)   | ID      |
| resID       | int(10)   | リレーションID|
| date        | date      | 日付    |
| start       | datetime  | 開始時間 |
| end         | datetime  | 終了時間 |
| max         | int(10)   | 受付数   |
| deleted_at  | timestamp | 論理削除 |
| updated_at  | timestamp | 更新時間 |
| created_at  | timestamp | 作成時間 |

### 要件
・　dateが重複していても、ユニークにして、それをページネーションする。
・　dateの配下で、1対多のリレーションで引っ張りたい

要件はこれくらいです。 

### モデル 
お決まりの通り、リレーションを使いたいので、Modelの中に、hasManyとbelongsToを作っておきます。
``` php:Timeslots.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

/**
 * @method static
 */
class Timeslots extends Model
{
    use SoftDeletes;
    protected $dates = ['deleted_at'];
    protected $table = 'timeslots';

    protected $fillable = [
        'resID',
        'date',
        'start',
        'end',
        'max'
    ];

    /**
     * 日付リレーション
     * @return \Illuminate\Database\Eloquent\Relations\hasMany
     */
    public function times(): \Illuminate\Database\Eloquent\Relations\hasMany
    {
        return $this->hasMany('App\Models\Reserve\RsvTimeslots','date','date');
    }

    /**
     * 日付リレーション
     * @return \Illuminate\Database\Eloquent\Relations\belongsTo
     */
    public function time(): \Illuminate\Database\Eloquent\Relations\belongsTo
    {
        return $this->belongsTo('App\Models\Reserve\RsvTimeslots','date','date');
    }
}

```

### コントローラー
要件を基に、コントローラーを作っていきます。

``` php:TimeslotsController.php
<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Timeslots;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;

class TimeslotsController extends Controller
{
    private $resID;

    /**
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index(Request $request, $id)
    {
        //対象IDの配列を作る つまり、日付をユニークにして、IDをかき集める。
        $whereArry = [
            ['resID',$id],
            ['start', '>', Carbon::now()]
        ];
        $timeslotIDs = Timeslots::select('id', 'date')
                        ->where($whereArry)
                        ->orderBy('date', 'asc')
                        ->get()
                        ->unique('date')
                        ->pluck('id')
                        ->toArray();
        //withの対象をresIDで絞り込むので
        $this->resID = $id;

        //日付のユニークIDでページネーションを作って、配下にwithで1対多のレコードをリレーション。
        //リレーション先のクエリーは、resIDで絞り込みはしたい。
        $timeslots = Timeslots::with([
            'times' => function ($query) {
                $query->where('resID', $this->resID);
            }]
        )
            ->select('timeslots.id', 'timeslots.date')
            ->whereIn('timeslots.id', $timeslotIDs)
            ->orderBy('timeslots.date', 'asc')
            ->paginate();

        return view('timeslot', [
            'timeslots' => $timeslots,
        ]);
    }
}
```


### ビュー
あとは、単純です。
日付のループの中にある、時間ループを回すだけです。
日付単位でページネーションも作られます。
日付に関連した時間リストも出せます。
``` php:timeslot.blade.php
<div class="card card-sm card-body shadow-sm">
        <div class="card-body">
            @foreach($timeslots as $timeslot)
                <div class="d-flex">
                    <div>
                        <span>{{\Illuminate\Support\Carbon::parse($timeslot->date)->isoFormat('YYYY年MM月DD日 (ddd)')}}</span>
                    </div>
                    <div>
                        @foreach($timeslot->times as $time)
                            <div>{{\Illuminate\Support\Carbon::parse($time->start)->isoFormat('HH時mm分')}}〜{{\Illuminate\Support\Carbon::parse($time->end)->isoFormat('HH時mm分')}}</div>
                        @endforeach
                    </div>
                </div>
            @endforeach    
        </div>
        <div class="card-body">
            <nav class="bottom-pagenation" aria-label="Page navigation">
                {{ $timeslots->links() }}
            </nav>
        </div>
    </div>
```
こんな感じで作ったら、同じテーブルのデータを1対多で括りながら、ページネーションできるようになります。
他にもっと簡単に書ける方法があったら知りたいところです。
参考になりますでしょうか。