Custom paginator for laravel for redis and skip first rows


 

 

Пагинация по массиву в редисе

    private function procKey($page, $per_page, $message)
    {
        $llen = Redis::connection()->llen("$message");
        $res = [];
        $res["per_page"] = intval($per_page);
        $res["last_page"] = intval(ceil($llen / $per_page));
        $res["total"] = $llen;
        if (!$page && $llen % $per_page > 0) {
            $page = $res["last_page"] > 1 ? $res["last_page"] - 1 : 1; // вдруг нет 2й страницы
            $els = Redis::connection()->lrange("$message", -($page * $per_page + $llen % $per_page), -(($page - 1) * $per_page + 1));
        } else {
            $page = $page ?? $res["last_page"];
            $els = Redis::connection()->lrange("$message", -($page * $per_page), -(($page - 1) * $per_page + 1));
        }
        foreach ($els as &$el) {
            $el = json_decode($el);
        }
        $res["page"] = intval($page);
        $res["data"] = array_reverse($els);
        return $res;
    }

Пагинация с рваной первой страницей

        //
        $page = $data["page"] ?? "1";
        $per_page = 18;
        $res = [];
        $llen = $q->count();
        $q->limit($page == "1" ? $per_page - 1 : $per_page);
        $q->skip($page > 1 ? $per_page - 1 + ($per_page * ($page - 2)) : 0);
        $res["per_page"] = $per_page;
        $res["last_page"] = 1;
        $sum = $per_page - 1;
        while ($sum < $llen) {
            $res["last_page"]++;
            $sum += $per_page;
        }
        $res["total"] = $llen;
        $res["current_page"] = intval($page);
        $res["next_page_url"] = $res["last_page"] == $page ? null : "next";
        $res["data"] = $q->get();
        //