如何在Livewire中为Group By后的查询结果实现分页?
解决Livewire中分组数据的分页问题
你的核心问题在于:直接对paginate()结果分组会丢失分页对象的方法,而先查询所有数据再分组又无法实现分页。正确的思路是先对分组维度(debitur_id)进行分页,再根据分页后的ID查询对应数据并分组,具体实现如下:
1. 修改getAllDokumen()方法
public function getAllDokumen() { // 第一步:获取分页的debitur_id集合(按debitur数量分页,这里每页10个debitur) $paginatedDebiturs = Dokumen::select('debitur_id') ->distinct() ->paginate(10); // 第二步:根据分页后的debitur_id查询对应的所有文档并分组 $groupedDokumen = Dokumen::whereIn('debitur_id', $paginatedDebiturs->pluck('debitur_id')) ->get() ->groupBy('debitur_id'); // 第三步:将分组后的数据替换分页对象的默认集合 $paginatedDebiturs->setCollection($groupedDokumen); return $paginatedDebiturs; }
2. 前端视图无需大幅修改
因为返回的$allDokumen仍然是LengthAwarePaginator分页对象,原有循环和分页链接代码可以直接使用:
@foreach ($allDokumen as $dok) <tr> <td rowspan="11">{{ $loop->iteration }}</td> <td rowspan="11">{{ $dok->first()->debitur->no_debitur }}</td> <td rowspan="11">{{ $dok->first()->debitur->nama_debitur }}</td> </tr> @foreach (['PPJB', 'AJB', 'SKMHT', 'APHT', 'PH', 'SHT', 'IMB', 'Sertipikat', 'PK', 'CN'] as $jenis) @php $d = $dok->where('jenis', $jenis)->first(); @endphp @if ($d) <tr> <td>{{ $jenis }}</td> <td> @if ($d->status_pinjaman == 0) Tersedia @elseif ($d->status_keluar == 1) Keluar @elseif ($d->status_pinjaman == 1) Dipinjam @endif </td> </tr> @else <tr> <td>{{ $jenis }}</td> <td>Tidak Tersedia</td> </tr> @endif @endforeach @endforeach <div class="mt-4 items-center"> {{ $allDokumen->links() }} </div>
关键逻辑说明
- 先对
debitur_id去重分页:确保分页是按借款方(debitur)数量来划分,符合你分组展示的需求。 - 替换分页对象的集合:保留
LengthAwarePaginator的所有分页方法(如links()、currentPage()等),同时让分页对象承载分组后的文档数据。
内容的提问来源于stack exchange,提问作者PinKevin
相关产品推荐
相关产品推荐

