질문을 삭제하지 말아주세요.!
 
1
0
-1

$test->appends()->render()

위와 같은 코드로 페이지네이션을 기능을 구현했습니다.

질문드리고 싶은 것은 아이템수가 100페이지가 넘어가면 그 이상의 페이지링크는 생성하지 않고

항상 100페이지로 제한하고싶은데 어떤식으로 구현해야 할지입니다.

custom presenter를  이용하지 않고는 구현이 불가능한가요?



    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1

      질문을 잘 이해하지 못했는데... 엘로퀀트 빌더에서 쿼리하실 때 레코드 개수를 제한하면 되지 않을까요?

      const PER_PAGE = 10;
      const MAX_PAGE = 100;
      
      
      // ...
      
      $paginatedCollection = YourModel::take(self::PER_PAGE * self::MAX_PAGE)->paginate(self::PER_PAGE);
        CommentAdd your comment...
      1.  
        1
        0
        -1

        깔끔하진 않지만, Model 객체와 Paginator 객체를 분리하여 별도로 작성해야 할 것 같습니다.

        # Eloquent\Builder 에서 페이지네이터 객체 생성 반환할 때 ,
        
        
        return new LengthAwarePaginator($results, $total, $perPage, $page, [
            'path' => Paginator::resolveCurrentPath(),
            'pageName' => $pageName,
        ]);


        아래 코드를 이용해서 최대 페이지를 조절 하시면 될것 같습니다.

        use Illuminate\Pagination\LengthAwarePaginator;
        use Illuminate\Pagination\Paginator;
        
        
        $pageName = 'page'; //query string field
        $currentPage = intval($request->get('page'));
        $per_page = 15;
        $offset = ($currentPage - 1) * $per_page;
        $max_page = 100;
        
        
        $results = Todo::offset($offset)->limit($per_page)->get();
        $totalCount = count(Todo::limit($per_page*$max_page)->get());
        
        $paginate = new LengthAwarePaginator($results, $totalCount, $per_page, $currentPage, [
            'path' => Paginator::resolveCurrentPath(),
            'pageName' => $pageName,
        ]);
        
        echo $paginate->appends([])->render();
        1. 갸르릉

          코드를 잘못 입력해 수정하였습니다.

        2. 갸르릉

          (다른분들의 시간절약을 위해 공유합니다. 저도... 엄청 삽질해서...)

          저도 limit이나 take를 먼저 걸어두고 paginate을 해보았는데...

          원하는 결과가 나오지 않더군요. ㅠㅡㅠ (당혹스러웠습니다.)

          왜 자꾸 limit 이 걸리지 않을까하고 DB 쪽 패키지를 뜯어 보았습니다.

          첫번째 이유, paginate 의 처리 과정을 살펴보니 전체 Row 수를 얻기 위해 쿼리문을 복제하게 되는데.. 그 과정에서 다음과 같이 쿼리를 수정을 하고 있었습니다.

          Illuminate/Database/Query/Builder paginate method
          # 복제한 쿼리문에서 다음의 구문들을 삭제함.
          ->cloneWithout(['columns', 'orders', 'limit', 'offset'])
          ->cloneWithoutBindings(['select', 'order'])
          # 전체 Row 개수를 구하기 위해 count 함수를 사용함.
          ->setAggregate('count', .......)
          ->get()->all() # 대략 이런쿼리로 실행됨 select count(*) as aggregate from Todo ....

          즉, Todo::limit(15)→paginate(10); 이렇게 할지라도 전체 Row 개수를 구할때는 limit 절을 빼고 쿼리를 실행합니다.

          두번째 이유, (저는 이걸 정말 모르고 있었어요...) MySQL count 함수가 limit 구문이 있어도 이건 개무시하더군요. (다른 DB는 모르겠습니다만 MySQL 에서는 이렇게 작동하더군요..ㅠㅡㅠ)

          저는 생각해 보니 count 함수를 쓸때, 여지껏 limit 을 준적도 없고... 줄 필요가 없어서 count 함수가 저렇게 동작한다는 사실을 이제서야 알았네요.

          다른분들은 저처럼 삽질 혹은 시간 할애 하지 않길 바랄께요^^ ㅎㅎ;;;;

        CommentAdd your comment...