Beste PRGers,
Ik ben momenteel bezig met het maken van een interne webapp (website) in Laravel 6 waarmee we de afwezigheid van collega's kunnen tonen. Ik lees iedere dag diverse iCalendar bestanden, combineer de gegevens en toon de uiteindelijke kalender van de komende twee dagen.
Ook is er een mogelijkheid om een lijst te krijgen van alle iCalendar events (Absences). Middels Pagination kan ik een netjes geordende lijst tonen met de paginering onderaan de overzichtspagina. Ik pagineer met 25 Absences per pagina.
Op dit moment staan er zo'n 500 Absences in de database. De wens is om te sorteren op de startdatum van de Absences en zodoende een oplopende lijst te genereren. Dit lukt ook allemaal prima. Het probleem is momenteel dat de pagination altijd op pagina 1 begint. Daardoor ziet de gebruiker standaard de Absences met de meest oude startdatum. Pas op pagina 15 komt het omslagpunt waarop de startdatum van de Absences van het verleden naar de toekomst gaat.
Ik kan nu (hardcoded) de startpagina van de Pagination op 15 zetten wanneer deze niet in de Request zit.
Wat ik graag zou willen is $page te berekenen op basis van het aantal Absences, het aantal Abscenses per pagina en het aantal Absences met een startdatum in de toekomst.
In pseudocode moet het zoiets worden
Kleine disclaimer: het kan zijn dat ik ergens een ceil moet vervangen door een floor
Mijn vraag is echter hoe ik dit zo netjes mogelijk "the Laravel-way" kan doen zonder dat ik daarvoor heel veel duplicate queries en of code ga creëren?
Nog wat versie-informatie over mijn omgeving:
Matis
Ik ben momenteel bezig met het maken van een interne webapp (website) in Laravel 6 waarmee we de afwezigheid van collega's kunnen tonen. Ik lees iedere dag diverse iCalendar bestanden, combineer de gegevens en toon de uiteindelijke kalender van de komende twee dagen.
Ook is er een mogelijkheid om een lijst te krijgen van alle iCalendar events (Absences). Middels Pagination kan ik een netjes geordende lijst tonen met de paginering onderaan de overzichtspagina. Ik pagineer met 25 Absences per pagina.
Op dit moment staan er zo'n 500 Absences in de database. De wens is om te sorteren op de startdatum van de Absences en zodoende een oplopende lijst te genereren. Dit lukt ook allemaal prima. Het probleem is momenteel dat de pagination altijd op pagina 1 begint. Daardoor ziet de gebruiker standaard de Absences met de meest oude startdatum. Pas op pagina 15 komt het omslagpunt waarop de startdatum van de Absences van het verleden naar de toekomst gaat.
Ik kan nu (hardcoded) de startpagina van de Pagination op 15 zetten wanneer deze niet in de Request zit.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| class AbsenceController extends Controller { /** * Display a listing of the resource. * * @param Request $request * @return Response */ public function index(Request $request): Response { $page = $request->input('page'); if ($page === null) { $page = 15; } $absences = Absence::with('user')->orderBy('start_date')->paginate(25, ['*'], 'page', $page); return Response()->view('absence.index', compact('absences')); } /* .... */ } |
Wat ik graag zou willen is $page te berekenen op basis van het aantal Absences, het aantal Abscenses per pagina en het aantal Absences met een startdatum in de toekomst.
In pseudocode moet het zoiets worden
code:
1
2
3
4
5
| $absencesPerPage = 25; $totalAbsences = select count(*) as aggregate from `absences` $totalFutureAbsences = select count(*) as aggregate from `absences` where `start_date` > '2020-03-04 00:00:00' $totalPages = ceil($totalAbsences / $absencesPerPage) $page = $totalPages - ceil($totalFutureAbsences / $absencesPerPage) |
Kleine disclaimer: het kan zijn dat ik ergens een ceil moet vervangen door een floor
Mijn vraag is echter hoe ik dit zo netjes mogelijk "the Laravel-way" kan doen zonder dat ik daarvoor heel veel duplicate queries en of code ga creëren?
Nog wat versie-informatie over mijn omgeving:
- PHP: 7.4.2
- Laravel Framework: 6.16.0
- MySQL: 8.0.19
Matis
If money talks then I'm a mime
If time is money then I'm out of time