> $sequences ordered name => query builder; order = fill priority * @param array $paginatorOptions passed straight to LengthAwarePaginator (path/query) * @return array{items: array>, paginator: LengthAwarePaginatorContract} */ public static function slice(array $sequences, int $page, int $perPage, array $paginatorOptions = []): array { $totals = []; foreach ($sequences as $key => $query) { $totals[$key] = $query->count(); } $totalItems = array_sum($totals); $remainingOffset = ($page - 1) * $perPage; $remainingLimit = $perPage; $items = []; foreach ($sequences as $key => $query) { $total = $totals[$key]; if ($remainingLimit <= 0 || $remainingOffset >= $total) { $items[$key] = collect(); $remainingOffset = max(0, $remainingOffset - $total); continue; } $limit = min($remainingLimit, $total - $remainingOffset); $items[$key] = $query->skip($remainingOffset)->take($limit)->get(); $remainingLimit -= $limit; $remainingOffset = 0; } $paginator = new LengthAwarePaginator([], $totalItems, $perPage, $page, $paginatorOptions); return ['items' => $items, 'paginator' => $paginator]; } }