makedo / php-paginator

独立于数据源的 PHP 分页器

1.0.2 2019-09-05 07:59 UTC

This package is auto-updated.

Last update: 2024-09-05 19:55:21 UTC


README

这是另一个 PHP 分页器。本包的主要思想是构建独立于数据源的分页器,它具有在多种模式下工作的能力。

  • 按 ID 跳过计数

        $loader = function (int $limit, int $skip): iterable
        {
            //SELECT * from users  WHERE id > $skip LIMIT $limit
        };
        
        $perPage = 100;
        $lastIdOnPreviousPage = 34;
        
        $paginatorFactory = new SkipById($perPage);
      
        $page = $paginatorFactory
            ->createPaginator(new CallableLoader($loader), $lastIdOnPreviousPage)
            ->paginate()
        ;

    在这个例子中,你可以使用 id 作为跳过值。如你所见,Loader 函数接受 id$skip 变量中。它应该是上一页上的最后一个项目的 id,它来自客户端。对于第一页,它应该是 0。对于 $page->hasNext 分页器将加载 $perPage + 1 个项目,然后检查实际加载的项目数量是否超过 $perPage

    可选地,你可以设置 $currentPage 的值,它将被设置为 $page->currentPage

  • 按 ID 跳过计数并使用总计数

       $loader = function (int $limit, int $skip): iterable {
           //SELECT * from users  WHERE id > $skip LIMIT
       };
      
       $counter = function (): int {
           //SELECT count(id) from users
       };
       
       $perPage = 100;
       $lastIdOnPreviousPage = 35;
       
       $paginatorFactory = new SkipByIdCountable($perPage);
       $page = $paginatorFactory
           ->createPaginator(
               new CallableLoader($loader),
               new CallableCounter($counter),
               $lastIdOnPreviousPage
           )
           ->paginate()
       ;

    在上面的例子中,分页器按 ID 跳过计数并使用总计数作为 $page->total$page->totalPages 的值。对于 $page->hasNext 分页器将加载 $perPage + 1 个项目,然后检查实际加载的项目数量是否超过 $perPage

  • 按 ID 跳过计数并使用总计数和当前页

       $loader = function (int $limit, int $skip): iterable {
           //SELECT * from users  WHERE id > $skip LIMIT
       };
      
       $counter = function (): int {
           //SELECT count(id) from users
       };
       
       $perPage = 100;
       $lastIdOnPreviousPage = 35;
       $currentPage = 4;
       
       $paginatorFactory = new SkipByIdCountable($perPage);
       $page = $paginatorFactory
           ->createPaginator(
               new CallableLoader($loader),
               new CallableCounter($counter),
               $lastIdOnPreviousPage,
               $currentPage
           )
           ->paginate()
       ;

    在上面的例子中,分页器按 ID 跳过计数并使用总计数和 $currentPage 作为 $page->total$page->totalPages$page->hasNext 的值。在这种情况下,我们知道 $currentPage 的值,在实际情况中它来自客户端,因此我们可以使用总计数和 $currentPage 来计算 $page->hasNext,而不使用 $perPage + 1 策略。

  • 按偏移量跳过计数

    $loader = function (int $limit, int $skip): iterable
    {
        //SELECT * from users LIMIT $limit OFFSET $skip
    };
    
    $perPage = 100;
    $currentPage = 2;
    
    $paginatorFactory = new SkipByOffset($perPage);
    
    $page = $paginatorFactory
        ->createPaginator(new CallableLoader($loader), $currentPage)
        ->paginate()
    ;

    在上面的例子中,分页器根据 $perPage 和 $currentPage 的值按偏移量跳过计数。对于计算 $page->hasNext,分页器将加载 $perPage + 1 个项目,然后检查实际加载的项目数量是否超过 $perPage

    • 按偏移量跳过计数并使用总计数

         $loader = function (int $limit, int $skip): iterable {
             //SELECT * from users LIMIT $limit OFFSET $skip
         };
        
         $counter = function (): int {
             //SELECT count(id) from users
         };
         
         $perPage = 100;
         $currentPage = 2;
         
         $paginatorFactory = new SkipByOffsetCountable($perPage);
      
         $page = $paginatorFactory
             ->createPaginator(new CallableLoader($loader), new CallableCounter($counter), $currentPage)
             ->paginate()
         ;

      在上面的例子中,分页器按偏移量跳过计数并使用总计数作为 $page->total$page->totalPages 的值。