[Laravel] laravel - Pagination

[Laravel] laravel - Pagination updated_at: 2024-01-30 17:41

Pagination

참조 : https://laravel.com/docs/10.x/pagination

Paginating Query Builder Results

$users = DB::table('users')->paginate(15)

[결과]

아래와 같은 결과를 리턴한다.

{
"current_page":1, // 현재페이지
"data":[{}...], // 데이타 내용
"first_page_url":"3%BC.html?page=1", // 처음 페이지
"from":1, // 시작 페이지
"last_page":1385, // 총페이지 수
"last_page_url":"C.html?page=1385", // 마지막 페이지
"links":[ // 페이지 링크에 걸리는 상세
  {"url":null,"label":"« Previous","active":false},
  {"url":"http-url-file.html?page=1","label":"1","active":true},
  {"url":"http-url-file.html?page=2","label":"2","active":false},
  .............................................
  {"url":"http-url-file.html?page=2","label":"Next »","active":false}],
"next_page_url":"http-url-file.html?page=2", // 다음페이지
"path":"http-url-file.html",
"per_page":15, // 페이지당 항목 출력갯수
"prev_page_url":null, // 이전페이지
"to":30, // 처음 가져오는 아이템수
"total":13850 // 총 아이템 수
}

blade 에 적용

@forelse($users as $user)
    // 리스트 나열
@empty
    // 정보가 없습니다.
@endforelse
{{ $users->links() }}

Simple Pagination

$users = DB::table('users')->simplePaginate(15);

[결과]

simplePaginate 일경우 아래와 같은 결과를 리턴한다.

{
"current_page":1, // 현재페이지
"data":[{}...], // 데이타 내용
"first_page_url":"3%BC.html?page=1", // 처음 페이지
"from":1, // 시작 페이지
"next_page_url":"http-url-file.html?page=2", // 다음페이지
"path":"http-url-file.html",
"per_page":15, // 페이지당 항목 출력갯수
"prev_page_url":null, // 이전페이지
"to":30, // 처음 가져오는 아이템수
}

cursorPaginate

$users = DB::table('users')->cursorPaginate(15);

[결과]

cursorPaginate 일경우 아래와 같은 결과를 리턴한다.

{
"data":[{}...], // 데이타 내용
"path":"http-url-file.html",
"per_page":15, // 페이지당 항목 출력갯수
"next_page_url":"http-url-file.html?cursor=...", // 다음페이지
"prev_page_url":null, // 이전페이지
}

Cursor vs. Offset Pagination

# Offset Pagination...
select * from users order by id asc limit 15 offset 15;
 
# Cursor Pagination...
select * from users where id > 15 order by id asc limit 15;

Customizing Pagination URLs

현재 url 과 페이지네이션 할 url 이 다를 경우 사용 할 수 있다.

use App\Models\User;
 
Route::get('/users', function () {
  $users = User::paginate(15);
  $users->withPath('/admin/users');
  // ...
});

Appending Query String Values

pagination url에 특정값을 추가하고 싶을때 사용 가능하다.

use App\Models\User;
 
Route::get('/users', function () {
  $users = User::paginate(15);
  $users->appends(['sort' => 'votes']);
  // ...
});

검색 query를 같이 전달하고 자 할때

$users = User::paginate(15)->withQueryString();

withQueryString은 appends 로 구현할 때 아래와 같이 하여도 동일한 효과가 있다.

$users = User::paginate(20)->appends(request()->query());

Appending Hash Fragments

hash fragment 를 url에 넣을 경우(#users)

$users = User::paginate(15)->fragment('users');

Displaying Pagination Results

pagination 을 blade 쪽에서 디스플레이 하는 방식이다. 가장 일반적인 방식은 아래와 같다

{{ $users->links() }}

BootStrap Pagination

이부분은 버젼마다 사용법이 약간 다르다. 버젼에 상관없이 사용할 경우

{{ $users->links("pagination::bootstrap-4") }}

8.x App\Providers\AppServiceProvider 파일을 아래와 같이 수정한다.

use Illuminate\Pagination\Paginator;
 
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Paginator::useBootstrap();
}

10.x 9.x

use Illuminate\Pagination\Paginator;
 
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Paginator::useBootstrapFive();
    Paginator::useBootstrapFour();
}

버젼별 상세내용은 https://laravel.com/docs/9.x/pagination 에서 버젼을 변경하여 보시기 바랍니다.

사용자정의 Pagination

사용자의 기호에 따라 다양하게 페이지 네이션을 정의하여 사용할 수 있다. components/pagination-template.blade.php

@if ($paginator->hasPages())
  <ul class="pagination pagination">
    {{-- Previous Page Link --}}
    @if ($paginator->onFirstPage())
      <li class="page-item disabled"><span class="page-link">‹</span></li>
    @else
      <li class="page-item"><a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">‹</a></li>
    @endif

    @if($paginator->currentPage() > 2)
      <li class="page-item hidden-xs"><a class="page-link" href="{{ $paginator->url(1) }}">1</a></li>
    @endif
    @if($paginator->currentPage() > 3)
      <li class="page-item"><span class="page-link">...</span></li>
    @endif
    @foreach(range(1, $paginator->lastPage()) as $i)
      @if($i >= $paginator->currentPage() - 1 && $i <= $paginator->currentPage() + 1)
        @if ($i == $paginator->currentPage())
          <li class="page-item active"><span class="page-link">{{ $i }}</span></li>
        @else
          <li class="page-item"><a class="page-link" href="{{ $paginator->url($i) }}">{{ $i }}</a></li>
        @endif
      @endif
    @endforeach
    @if($paginator->currentPage() < $paginator->lastPage() - 2)
      <li class="page-item"><span class="page-link">...</span></li>
    @endif
    @if($paginator->currentPage() < $paginator->lastPage() - 1)
      <li class="page-item hidden-xs"><a class="page-link" href="{{ $paginator->url($paginator->lastPage()) }}">{{ $paginator->lastPage() }}</a></li>
    @endif

    {{-- Next Page Link --}}
    @if ($paginator->hasMorePages())
      <li class="page-item"><a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">›</a></li>
    @else
      <li class="page-item disabled"><span class="page-link">›</span></li>
    @endif
  </ul>
@endif

위의 정의된 템플릿을 사용하면 끝

{{ $products->links('components.pagination-template') }}

다른 방법으로는 @include를 사용하여 고전적 방식으로 제작할 수도 있다.

@include('partials/pagination', ['paginator' => $users])

skip, take

skip take를 사용하여 데이타를 가져올지, paginate를 사용하여 데이타를 가져올지를 선택적으로 처리하게 함

public function lists($tbl_name, Request $request)
{
  $offset = $request->offset;
  $take = $request->input('take', 10);


  $articles = Articles::
    select('id', 'user_id', 'user_name', 'content', 'title', 'image', 'hit', 'comment_cnt', 'created_at')
    ->where('bbs_table_id', $cfg->id)
    ->orderBy('order_num');

  if (isset($offset)) {
    $articles = $articles
    ->skip($offset)
    ->take($take)
    ->get();
  } else {
    $articles = $articles
    ->paginate($take);
  }

  return response()->json([
    'error'=>false,
    'articles' => $articles
  ], 200);//500, 203
}
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글