[Laravel] laravel - Pagination
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
}